JavaScript 有用的代码片段和 trick(4)
使用 ~x.indexOf('y')来简化 x.indexOf('y')>-1
var str = 'hello world'; if (str.indexOf('lo') > -1) { // ... } if (~str.indexOf('lo')) { // ... }
两者的差别之处在于解析和转换两者之间的理解。
解析允许字符串中含有非数字字符,解析按从左到右的顺序,如果遇到非数字字符就停止。而转换不允许出现非数字字符,否者会失败并返回NaN。
var a = '520'; var b = '520px'; Number(a); // 520 parseInt(a); // 520 Number(b); // NaN parseInt(b); // 520
parseInt方法第二个参数用于指定转换的基数,ES5默认为10进制。
parseInt('10', 2); // 2 parseInt('10', 8); // 8 parseInt('10', 10); // 10 parseInt('10', 16); // 16
对于网上 parseInt(0.0000008)的结果为什么为8,原因在于0.0000008转换成字符为"8e-7",然后根据 parseInt的解析规则自然得到"8"这个结果。
+ 拼接操作,+x or String(x)?
+运算符可用于数字加法,同时也可以用于字符串拼接。如果+的其中一个操作符是字符串(或者通过 隐式强制转换可以得到字符串),则执行字符串拼接;否者执行数字加法。
需要注意的时对于数组而言,不能通过 valueOf()方法得到简单基本类型值,于是转而调用 toString()方法。
[1,2] + [3, 4]; // "1,23,4"
对于对象同样会先调用 valueOf()方法,然后通过 toString()方法返回对象的字符串表示。
var a = {}; a + 123; // "[object Object]123"
对于 a+""隐式转换和 String(a)显示转换有一个细微的差别: a+''会对a调用 valueOf()方法,而 String()直接调用 toString()方法。大多数情况下我们不会考虑这个问题,除非真遇到。
var a = { valueOf: function() { return 42; }, toString: function() { return 4; } } a + ''; // 42 String(a); // 4
判断对象的实例
// 方法一: ES3 function Person(name, age) { if (!(this instanceof Person)) { return new Person(name, age); } this.name = name; this.age = age; } // 方法二: ES5 function Person(name, age) { var self = this instanceof Person ? this : Object.create(Person.prototype); self.name = name; self.age = age; return self; } // 方法三:ES6 function Person(name, age) { if (!new.target) { throw 'Peron must called with new'; } this.name = name; this.age = age; }