string 原理
String是JavaScript中非常常用的方法,被用来确定JavaScript对象的类型。它是Object对象原型上的方法,因此对于所有的Javascript对象,都可以使用该方法。当我们使用该方法时,它会返回一个表示该对象类型的字符串。在这篇文档中,我们将会深入了解String方法是如何工作的以及它是如何帮助我们判断对象类型的。
## toString()方法的语法 String()的语法如下: ```String() ``` 其中obj是需要被检测类型的对象。该方法返回一个由"[object"和结果字符串后接一个']'组成的字符串。结果字符串表示对象的类型。
例如:typeof操作符不能准确地判断对象的类型,如果我们要判断一个数组的类型,typeof会将其判断为object类型。 ```javascript let arr = [1, 2, 3]; console.log(typeof arr); //输出结果为object console.String()); //"[1, 2, 3]" ``` 从结果可以看出,arr的类型是object类型,而我们实际上想要获取的是数组类型。那么我们如何判断呢? String方法就可以为我们提供获取对象类型的正确方法。
## 基础实现原理 当我们调用String时,JavaScript会将该调用传递给我们需要检查类型的对象。因为String是一个函数,所以传递给它的唯一参数是this,而且该参数是一个隐式参数。具体如下: ```javascript String.call(obj) ``` 由于toString是Object.prototype上的方法,因此我们传递给它的参数应该是一个对象,而String方法本身却没有传递参数。这就是为什么我们需要用call将它与需要检查类型的对象连接起来。该方法可以指定函数内的this关键字上下文。因此,我们将检查类型的对象作为首个参数传递给了toString方法,并使用call方法将String作为一个函数来执行。这样JavaScript就会在上下文对象上执行String方法,从而返回一个表示该对象类型的字符串。例如,考虑对于数组的实现: ```javascript let arr = [1, 2, 3]; let type = String.call(arr); console.log(type); //输出结果是"[object Array]" ``` 我们使用call方法将String函数上下文置于arr上,这就意味着我们正通过toString函数来确定arr的类型。这意味着String不仅仅是一个简单的toString()方法调用。它实际上是一个高级功能的方法,它可以用来判断一个对象的类型。当我们调用String方法,并将我们需要检测类型的对象作为this参数传递时,JavaScript会在上下文对象上执行该方法,并返回一个表示该对象类型的字符串。
## 返回值的结构 String()返回的结果结构总是为"[object XXX]"。其中XXX表示需要检测的对象的构造函数的名称。例如,如果一个对象由JavaScript中Array构造函数创建,那么结果将是"[object Array]"。这种结果的结构通常被用来确定对象的类型。例如,如果结果字符串是"[object Array]",那么这个对象的类型就是数组类型。
## 返回值的例子 下面是一些例子来展示String()方法如何返回其结果字符串: ```javascript let str = "Hello, world"; console.log(String.call(str)) // "[object String]"
let num = 1; console.log(String.call(num)) // "[object Number]"
let arr = [1, 2]; console.log(String.call(arr)) // "[object Array]"
let obj = {key: "value"}; console.log(String.call(obj)) // "[object Object]" ``` 当我们将不同的JavaScript值传递给String方法时,该方法会根据值的类型而返回不同的结果字符串。在上述例子中,我们已经看到了处理字符串、数字、数组和对象的情况。
## 实现自定义判断类型的toString()方法 String方法不仅仅是用来判断JavaScript值得类型,我们还可以自定义一个toString方法通过它来判断类型。例如,我们想判断一个Date对象的类型,我们可以重写String方法,这样当我们调用toString方法时将返回"[object Date]"。 ```javascript String = function() {      return '[object Date]'; } let date = new Date(); console.log(String.call(date)); // "[object Date]" ``` 当我们重写String方法并将其绑定到Date对象上时,date对象的结果字符串就变成了"[object Date]"
## 总结 String方法是JavaScript中最常用的方法之一。它通过返回一个表示对象类型的结果字符串,为我们提供了一种方式来确定一个值的类型。当我们通过String.call(obj)方法调用这个函数时,JavaScript会将该调用传递给需要检查类型的对象,并根据它的构造函数的名称来生成结果字符串。这在处理通过语言内置类型(如数字和字符串)定义的值时非常有用,也可以在自定义类型时以相同的方式使用。
此外,我们还可以通过重写String方法来自定义返回结果字符串,以便更
好地处理自己创建的类型对象。这是非常有趣和有用的。因此,String方法不仅仅是一个用于确定对象类型的简单方法,还可以按需定制。