JavaScript 整理笔记(三)

1.1 语法

1.1.6 表达式

表达式后面一般跟着:
    一个运算符 与 另一个表达式
    三元运算符
    函数调用
    属性提取表达式

运算符优先级 从上往下优先级由高到低 
    . [] ()                          - 提取属性与调用函数
    delete new typeof + - !          - 一元运算符
    * / %                            - 乘法 除法 求余
    + -                              - 加法/连接 减法
    >= <= > <                        - 大于等于 小于等于 大于 小于
    === !==                          - 全等于 不去等于
    &&                               - 逻辑与
    ||                               - 逻辑或
    ?:                               - 三元运算符

typeof 运算符产生的值只有 'number'、'string'、'boolean'、'undefined'、'function'和'object'这六个值。
其中 typeof null === 'object', typeof [] === 'object',这是不对的。
通常用函数来判断:
    function DataType(obj, type) {
        return Object.prototype.toString.call(obj) === "[object " + type + "]" ? true : false;
    }

+ 运算符 可以进行加法运算或字符串连接。加法时确保两个运算数都是数字。否则会进行隐式转换。
例:
    '0' + 1 === '01'; // true
    1 + '0' === '10'; // true
    1 + 0 === 1; // true

&& 运算符 逻辑与 真&&真为真,真&&假为假,假&&真为假,假&&假为假。
例1:
    var a = 0;
    a && a++; // false
    a; // 0
例2: 
    var b = 1;
    b && b++; // true
    b; // 2
第一个运算数(或表达式)如果为false,则不执行第二个运算数(或表达式)。
第一个运算数(或表达式)如果为true,则执行第二个运算数(或表达式)。

|| 运算符 逻辑或 真||真为真,真||假为真,假||真为真,假||假为假。
例1:
    var c = 0;
    c || c++; // true
    c; // 1
例2: 
    var d = 1;
    d || d++; // true
    d; // 1
第一个运算数(或表达式)如果为false,则执行第二个运算数(或表达式)。
第一个运算数(或表达式)如果为true,则不执行第二个运算数(或表达式)。

! 运算符 逻辑非 !真为假,!假为真。
例:
    !true === false; // true
    !false === true; // true
    !undefined === true; // true
    !null === true; // true
    !"" === true; // true
    !0 === ture; // true
    !NaN === true; // true

1.2 对象

1.2.1 对象字面量

创建新对象值的表示法。
例:
    var obj = {};
    var obj_2 = {
        name: "Ama_zhe",
        "": "hello world"
    };
    obj_2[""] === "hello world"; // true
属性名可以是包括空字符串的任何字符串。属性名如果是合法的JavaScript标识符
并且不是保留字,则属性名不需要引号。
例:
    var obj_3 = {
        value: 1,
        "first-name": "fan"
    }

1.2.3 检索

检索对象里的值
优先使用.语法,其次是[]语法。如果检索的属性名是一个表达式来表示则使用[]来获取。
检索不存在的属性会返回undefined。
可以使用||运算符来默认填充:
例:
    var hello = obj_3.status || "0"; // "0"
如果从undefined中获取属性会报错,用&&来提前判断
例:
    var hi = obj_3.status && obj_3.status.value; // undefined

1.2.4 更新

对象的属性名如果已经存在,再对对象的属性名赋值时会更新其属性的值。
例:
    obj_3.value = 2;
    obj_3.value === 2; // true
如果对象之前没有该属性名,则会给对象添加该属性。
例:
    obj_3.name = "Stafan";
    obj_3; // { value: 2, "first-name": "fan", name: "Stafan" }

1.2.5 引用

对象是通过引用来传递值。它们永远不会被复制。
var a = obj_3;
a.status = "1";
var b = obj_3.status;
b; // "1" a和obj_3指向同一个对象引用,a.status相当于给obj_3添加了status属性,所有b的值为"1"。
var c = {}, d = {}, e = {}; 分别引用不同的空对象
c === d; // false
c === e; // false
d === e; // false
var f = g = h = {}; 都引用同一个空对象
f === g; // true
f === h; // true
g === h; // true

1.2.6 原型

每个对象都连接到一个原型对象。所有通过字面量创建的对象都连接到 Object.prototype。
if(typeof Object.create != "function"){
    Object.create = function(obj){
        var Fn = function(){};
        Fn.prototype = obj;
        return new Fn();
    }
}
var obj = {
    name: "a",
    value: "100"
};
var obj2 = Object.create(obj);
obj2.name = "b";     该对象改变是不会影响到该对象的原型
obj2.value = "200";  该对象改变是不会影响到该对象的原型
obj.name; // "a"
obj.value; // "100"
obj2.name; // "b"    该对象改变是不会影响到该对象的原型
obj2.value; // "200" 该对象改变是不会影响到该对象的原型

但是在检索对象的属性时,如果该对象没有要检索的属性,则会从原型对象中去获取。如果对象及
其原型链中都没有要获取的属性,则返回 undefined。
obj.data = "data";
obj2.data; // "data"
obj2.opt; // undefined

1.2.7 反射

检查对象的属性的类型:
    var obj3 = {
        name: "Ama_zhe",
        number: 2,
        obj: {}
    };
    typeof obj3.name === "string"; // true
    typeof obj3.number === "number"; // true
    typeof obj3.obj === "object"; // true
    typeof obj3.aaa === "undefined"; // true

检查原型链中的任何属性都会返回 "funtion":
    typeof obj3.toString === "function"; // true
    typeof obj3.constructor === "function"; // true
    typeof obj3.valueOf === "function"; // true

hasOwnProperty 会检查对象独有的属性,而不会检查原型链:
    obj3.hasOwnProperty(name) === true; // true
    obj3.hasOwnProperty(toString) === false; // true

1.2.8 枚举

for...in 会枚举对象中的所有的属性名(包括原型链中的属性),用hasOwnProperty 和
typeof 来过滤掉不想要的属性或函数。
属性名出现的顺序是不确定的,如果想要属性以特定的顺序出现,最好避免使用for...in。

1.2.9 删除

delete 运算符用来删除对象的属性。不会删除原型链中的同名属性。
例1:
    var obj6 = {
        a: 1,
        b: 2
    };
    delete obj6.a;
    obj6; // { b: 2 }
例2:
    var obj = {
        a: 1,
        b: 2,
        name: "seven"
    };
    var Fn = function(){};
    Fn.prototype = obj;
    var obj_n = new Fn();
    obj_n.name = "eight";
    obj_n.name; // "eight"
    delete obj_n.name;
    obj_n.name; // "seven"

1.2.10 减少全局变量污染

最小化全局变量的方法就是只创建唯一的一个全局变量:
    var GLOBAL_VARIABLE = {};
定义其他的变量为该全局变量的属性:
    GLOBAL_VARIABLE.API = {
        common_link: ""
    };
    GLOBAL_VARIABLE.initFn = {
        add: function(){
            var sum = 0;
            Array.apply(this, arguments).map(function(a){
                sum += a;
            });
            return sum;
        }
    };

——–内容系个人整理,如有错误,欢迎指出。谢谢!——–

猜你喜欢

转载自blog.csdn.net/Ama_zhe/article/details/81540827