首先,问个问题:在 JavaScript 中,怎样使 x !== x
?
什么!原来变量自己还可以不全等于自己?!
答:当然咯,NaN
NaN === NaN
// false
jym:“哈?就这?”
本瓜:“别急,这才刚起步,抓紧坐稳啦!”
有没有可能,这个变量不是 NaN,但是仍然满足 x !== x
呢?
答:当然咯,它可以是任何值!
window.x = 0 // x 设为任何值都可
Object.defineProperty(window, 'x', {
get () {
return Math.random()
}
})
console.log(x)
console.log(x !== x)
// 0.6087838197109388
// true
Amazing!!
我们通过 object. Defineproperty
设置 get
方法,返回一个随机数,即能满足任意值的:x !== x
了
jym:“还有吗?”
本瓜:“当然啦!”
除了能让 x !== x
,还能让 x === x + 1
,信不信?
它就是:
const x = Number.MAX_SAFE_INTEGER + 1
x===x+1
// true
Number.MAX_SAFE_INTEGER
常量表示在 JavaScript 中最大的安全整数(maxinum safe integer)(2^53 - 1)
crazy!!
os:要是把这写在项目代码里,那不得是“唯我独尊”?🐶🐶🐶
jym:“这有用吗?”
本瓜:“当然有用,最大的用处就是知道这么个东西,防止被坑,避免少见多怪。”
除了 x !== x
、x === x + 1
,咱还可以让 x > x
const x = {
value: 1,
[ Symbol.toPrimitive ] () {
console.log('x', this.value)
return --this.value
}
}
console.log(x > x)
// x 1
// x 0
// true
Symbol.toPrimitive
是一个内置的 Symbol 值,它是作为对象的函数值属性存在的,当一个对象转换为对应的原始值时,会调用此函数。
该函数被调用时,会被传递一个字符串参数 hint
,表示要转换到的原始值的预期类型。 hint
参数的取值是 "number"
、"string"
和 "default"
中的任意一个。
MDN 示例:
// 一个没有提供 Symbol.toPrimitive 属性的对象,参与运算时的输出结果
var obj1 = {};
console.log(+obj1); // NaN
console.log(`${obj1}`); // "[object Object]"
console.log(obj1 + ""); // "[object Object]"
// 接下面声明一个对象,手动赋予了 Symbol.toPrimitive 属性,再来查看输出结果
var obj2 = {
[Symbol.toPrimitive](hint) {
if (hint == "number") {
return 10;
}
if (hint == "string") {
return "hello";
}
return true;
}
};
console.log(+obj2); // 10 -- hint 参数值是 "number"
console.log(`${obj2}`); // "hello" -- hint 参数值是 "string"
console.log(obj2 + ""); // "true" -- hint 参数值是 "default"
哈哈哈,看到这里,jym 不由觉得:呵呵,JavaScript 真好玩(苦笑脸)
嘻嘻嘻,最后再附送一个问题:
在 JavaScript 中,有没有可能使得:typeof x === 'undefined' && x.length > 0
返回 true
呢?