平常看书中看到太多的细节,干脆把它们都记下来,偶尔自己看看也好。。。
1、对 Object 采用 '+' 运算符,Object 对象首先调用 valueOf() 返回简单值,之后如果两个操作数都是 number 对象,
则采取算术相加,否则再调用toString()方法,采用字符串连接。
2、在JS中,所有 Number 对象都以浮点数格式存储。-(一元)、-(二元)、+(一元)、*、/、% 运用于非数字类型操作数时,
都将尝试将其转化为数字。非0数除以0返回 +(-)infinity。0/0 返回 NaN。
3、求余符号(%)的运算结果的符号(正负号)与第一个操作数相同。它不仅适用于整型,而且适用于浮点型。如:-4.3 % 2.1 = -0.1
4、==(Equality) 和 ===(Identity)
4.1 number 、 string 和 boolean 是通过值比较的,只要值相同就返回 true
4.2 Object 、 Array 和 function 是通过引用比较的,只有指向同一对象的两个变量才相等,各自的两个Array,即使包含相同的元素,
对 == 和 ===来说都不可能相等。
5、===(Identity)
5.1 NaN 不与任何值唯一相等,即使是它本身,可以用全局方法 isNaN() 判断变量是否为 NaN
5.2 两个 null 或两个 undefined 都是唯一相等的
6、==(Equality)
6.1 如果两个操作数类型相同,比较规则和 === 是一样的
6.2 如果两个操作数类型不同,将按以下规则转换后进行比较
6.2.1 null == undefined 返回 true
6.2.2 一个number 和一个 string ,先将 string 转换成 number 后再比较
6.2.3 如果其中一个是true,则将其转换为 1 再比较;如果其中一个是false,则将其转换为 0 再比较。
6.2.4 一个 object 和一个 number 或 string 比较时,先将 object 转换为简单类型再比较。除了 Date 的其他内置类对象,
都先调用valueOf() ,必要时再调用 toString()方法,而 Date 只调用 toString()
e.g.
//1. true 先转换为1,比较 '1' == 1
//2. '1' 再转换为 1,比较 1 == 1
7、<、<=、>、>=
7.1 以上关系运算符只能应用于数字和字符串
7.2 当一个数字和一个字符串比较时,尝试将字符串转化为数字
7.3 与 NaN 的比较都返回 false
7.4 字符串的比较是逐字符比较的,而且大小写敏感
8、 in
in 左边必须是一个字符串或可以转化为字符串的变量,右边必须是一个 object ,当左边字符串是右边对象的一个属性名时返回 true
比如:var cat = { age: 3 }; var isHasAge = 'age' in cat; // return true
9、 instanceof
instanceof 左边必须是一个对象,右边必须是一个类名。当左边对象是右边类的一个实例时返回 true
注意:所有对象都是 Object 的实例.
比如:var d = new Date(); var isInstance = d instanceof Date; // return true
10、 &&
如果将逻辑与运算符用在判断真假,与其他强类型语言是没什么不同的。JS的&&运算符在返回值上值得注意。
第一个操作数为假或可以转换为假时,表达式返回第一个操作数的值,而不是返回false。
第一个操作数为真或可以转换为真时,返回第二个操作数的值。
var x = (i++ && false);
alert(x);
alert(typeof x);
// 0
// 'number'
11、 ||
同样,逻辑或在返回值上也与其他强类型语言不同。
第一个操作数为真或可以转换为真时,表达式返回第一个操作数的值,而不是返回 true。
第一个操作数为假或可以转换为假时,表达式返回第二个操作数的值,而不论第二个操作数经过转换后是不是为假。
12、 typeof
typeof 其实是一个运算符(operator),它返回变量、属性或数组元素的内置类型。它有两种语法:
1、 typeof x
2、 typeof(x), 看起来更像一个函数
注意: typeof null 的结果是: 'object'
在用 for/in 迭代对象属性时,JS认为属性和方法都是对象的属性,这时你可以用 typeof 访问属性,如果是方法会返回 'function'
13、delete
delete 用于删除对象属性、数组元素或变量。删除成功时返回 true,否则返回 false 。
有些属性或变量是不允许被删除的,比如内置对象。用 var 显式声明的变量不可以被删除,但没用 var 声明的变量可以被删除。
当操作数不存在时(比如要删除的属性或变量不存在),delete 返回true。
注意:当对象属性也是对象类型时,delete删除的只是属性,而不会删除属性所引用的对象,换句话说,只是删除属性名。
JS中的内存管理是由垃圾回收作统一管理的,类似于C#。
{
x: new Date(),
y: function() { }
};
var result = delete obj.y;
alert(result); // true, 删除成功时返回 true
alert(typeof obj.y); // undefined, 已被删除的对象属性
result = delete undefined; // undefined 其实是一个全局属性
alert(result); // false, 内置的属性不允许被删除
var x = 0;
alert(delete x); // false, 用var显式声明的变量不允许被删除
alert(x); // 0, 变量依然存在,没被删除
alert(delete obj.z); // true, 删除不存在的属性时返回 true
alert(delete a); // true, 删除不存在的变量时返回 true
obj.date = obj.x;
alert(delete obj.x); // true
alert(obj.date.getFullYear()); // 2009