以下console.log
会输出什么?
const obj = {}
const fun = () => {}
console.log(obj.toString === Object.toString)
console.log(fun.toString === Function.toString)
console.log(obj.toString === Object.prototype.toString)
console.log(fun.toString === Function.prototype.toString)
console.log(Object.toString === Object.prototype.toString)
console.log(Function.toString === Function.prototype.toString)
答案
// 创建一个空对象
const obj = {}
// 创建一个空的箭头函数
const fun = () => {}
// 检查obj的toString方法是否等于Object的toString方法,预期为false
console.log(obj.toString === Object.toString)
// 检查fun的toString方法是否等于Function的toString方法,预期为true
console.log(fun.toString === Function.toString)
// 检查obj的toString方法是否等于Object.prototype上的toString方法,预期为true
console.log(obj.toString === Object.prototype.toString)
// 检查fun的toString方法是否等于Function.prototype上的toString方法,预期为true
console.log(fun.toString === Function.prototype.toString)
// 检查Object的toString方法是否等于Object.prototype上的toString方法,预期为false
console.log(Object.toString === Object.prototype.toString)
// 检查Function的toString方法是否等于Function.prototype上的toString方法,预期为true
console.log(Function.toString === Function.prototype.toString)
obj.toString !== Object.toString
这个表达式比较了对象实例的 toString
方法和 Object
的 toString
方法是否相同。在 JavaScript 中,Object.prototype.toString
是所有对象的默认 toString
方法,而具体对象的 toString
方法可能被覆盖或者修改。
Object.prototype.toString
Object.prototype.toString
是 Object
类的原型方法。它是所有对象的默认 toString
方法,通常返回一个表示对象类型的字符串。例如,对于一般对象,它返回 [object Object]
;对于数组,它返回 [object Array]
;对于函数,它返回 [object Function]
。
console.log(Object.prototype.toString.call({})); // [object Object]
console.log(Object.prototype.toString.call([])); // [object Array]
console.log(Object.prototype.toString.call(function(){})); // [object Function]
toString
方法JavaScript 对象可以覆盖其 toString
方法,以提供自定义的字符串表示。例如,你可以为一个对象定义一个 toString
方法:
const obj = {
toString() {
return 'Custom string representation';
}
};
console.log(obj.toString()); // Custom string representation
obj.toString !== Object.toString
由于上面的对象 obj
重新定义了 toString
方法,obj.toString
不再等于 Object.prototype.toString
。这就解释了为什么 obj.toString !== Object.toString
这个表达式在这种情况下为 true
。请注意 Object.toString
并不是一个有效的表达式,它是 Object.prototype.toString
的错误引用,正确的写法是 Object.prototype.toString
。
const obj = {
toString() {
return 'Custom string representation';
}
};
// 这是正确的比较
console.log(obj.toString === Object.prototype.toString); // false
// 比较对象的 toString 方法与 Object.prototype.toString 方法
console.log(Object.prototype.toString.call(obj)); // [object Object]
在这个例子中,obj.toString
是一个自定义的实现,而 Object.prototype.toString
是标准的实现。因此,它们不相等。
obj.toString
和 Object.prototype.toString
通常是不相等的,因为 obj.toString
可以被对象的自定义实现覆盖,而 Object.prototype.toString
是所有对象的默认 toString
方法。理解这一点有助于在调试和扩展 JavaScript 对象时进行正确的操作。
fun.toString === Function.toString
比较了函数实例的 toString
方法和 Function
构造函数的 toString
方法。
Function.prototype.toString
Function.prototype.toString
是所有函数的 toString
方法,通常返回函数的源代码文本。例如:
function example() {
return 'Hello, world!';
}
console.log(example.toString()); // "function example() { return 'Hello, world!'; }"
toString
方法每个函数的 toString
方法默认继承自 Function.prototype.toString
。如果没有被覆盖,函数的 toString
方法返回其源代码。比如:
const func = function() {
return 'Hello!';
};
console.log(func.toString()); // "function() { return 'Hello!'; }"
fun.toString === Function.toString
这个比较实际上是比较 fun.toString
和 Function.toString
。Function.toString
是 Function.prototype.toString
的一个引用,通常指向 Function.prototype.toString
方法本身。
function example() {}
console.log(example.toString === Function.prototype.toString); // true
这里,example.toString
是 example
函数的 toString
方法,而 Function.prototype.toString
是所有函数 toString
方法的原型。因此,在未被重写的情况下,它们应该是相等的。
在默认情况下,fun.toString === Function.prototype.toString
为 true
。这是因为 Function.prototype.toString
定义了所有函数的 toString
方法的标准行为,函数实例的 toString
方法默认是从 Function.prototype.toString
继承的。如果在自定义函数中覆盖了 toString
方法,则这种比较可能返回 false
。