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;
}
