JavaScript 小测验 toString

toString方法

以下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 方法和 ObjecttoString 方法是否相同。在 JavaScript 中,Object.prototype.toString 是所有对象的默认 toString 方法,而具体对象的 toString 方法可能被覆盖或者修改。

1. Object.prototype.toString

Object.prototype.toStringObject 类的原型方法。它是所有对象的默认 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]

2. 对象的 toString 方法

JavaScript 对象可以覆盖其 toString 方法,以提供自定义的字符串表示。例如,你可以为一个对象定义一个 toString 方法:

const obj = {
  toString() {
    return 'Custom string representation';
  }
};

console.log(obj.toString()); // Custom string representation

3. 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.toStringObject.prototype.toString 通常是不相等的,因为 obj.toString 可以被对象的自定义实现覆盖,而 Object.prototype.toString 是所有对象的默认 toString 方法。理解这一点有助于在调试和扩展 JavaScript 对象时进行正确的操作。

fun.toString === Function.toString

比较了函数实例的 toString 方法和 Function 构造函数的 toString 方法。

1. Function.prototype.toString

Function.prototype.toString 是所有函数的 toString 方法,通常返回函数的源代码文本。例如:

function example() {
  return 'Hello, world!';
}

console.log(example.toString()); // "function example() { return 'Hello, world!'; }"

2. 函数的 toString 方法

每个函数的 toString 方法默认继承自 Function.prototype.toString。如果没有被覆盖,函数的 toString 方法返回其源代码。比如:

const func = function() {
  return 'Hello!';
};

console.log(func.toString()); // "function() { return 'Hello!'; }"

3. fun.toString === Function.toString

这个比较实际上是比较 fun.toStringFunction.toStringFunction.toStringFunction.prototype.toString 的一个引用,通常指向 Function.prototype.toString 方法本身。

function example() {}

console.log(example.toString === Function.prototype.toString); // true

这里,example.toStringexample 函数的 toString 方法,而 Function.prototype.toString 是所有函数 toString 方法的原型。因此,在未被重写的情况下,它们应该是相等的。

总结

在默认情况下,fun.toString === Function.prototype.toStringtrue。这是因为 Function.prototype.toString 定义了所有函数的 toString 方法的标准行为,函数实例的 toString 方法默认是从 Function.prototype.toString 继承的。如果在自定义函数中覆盖了 toString 方法,则这种比较可能返回 false

你可能感兴趣的:(JavaScript能力测验,javascript,前端,toString,面试题)