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;
}
};
——–内容系个人整理,如有错误,欢迎指出。谢谢!——–