JS中‘hello’与new String(‘hello’)引出的问题详解
定义一个字符串
在工作中我们大概有3种方法去定义一个字符串:
1.varstr='hello';
2.varstr1=String('hello');
3.varstr2=newString('hello');
(下文直接会带以上三个变量....)
这三种方法定义出来的'hello',都有自己的属性例如lengh,有自己的方法例如:indexOf(),在日常工作定义中也没有感觉到任何的不同。
那是否深入过,
1.这三种方式定义出来的'hello',是否是一样的呢?
2.为什么基本类型可以直接调用其对应的方法呢?
这三种方式定义出来的'hello',是否是一样的呢?
console.log(str===str1)//true console.log(str===str2)//false console.log(str1===str2)//false
我们可以发现最后一种方式定义的与上面两种方式定义的不相等。
???
首先我们知道一个东西就是:
new出来的一定是对象。
所以分别打出三个的类型:
console.log(typeofstr)//string console.log(typeofstr1)//string console.log(typeofstr2)//object
所以这也就是为什么不会严格相等的原因。
引出数据类型与堆栈之间的关系
尝试深入理解原因:
我们知道,String,Number,Boolean在JS中是基本类型,基本类型是存储在栈(stack)内存中的,数据大小确定,内存空间大小可以分配。
而引用类型是存储在堆(heap)内存中的,例如对象,栈中存在的仅仅是一个堆的指针,这也就是我们日常遇到a={num:1},b=a,b.num1=2,那么a.num1也为2的原因。因为a,b同时指向同一个地址。
前两种方式定义出来的是在栈中并且值相等,而第三种方法定义出来的仅仅是栈中的一个指针。
所以这也是为什么三种方式定义出来的不一样。
为什么基本类型可以直接调用其对应的方法呢?
尝试:
console.log(str.length)//5 str.say='world' console.log(str.say)//undefined console.log(str1.lengh)//5 str1.say='world' console.log(str1.say)//undefined console.log(str2.lengh)//5 str2.say='world' console.log(str.say)//world
引出包装对象和原始资料类型
我们发现第一种第二种方式均可访问lengh属性,
但是为什么我们并不能自定义一个属性并进行访问?
数字、字符串、布尔三者,在JS中称为原始的(primitives)资料类型,而newString(),newNumber()就是包装对象。
包装对象也是对象。
这也就是为什么我们打印三种类型分别为:string(原始资料类型),string(原始资料类型),object(包装对象).
我们可以理解new出来的str2对象有String的一系列方法
console.log(str2.indexOf===String.prototype.indexOf)//true
那尝试一下第一种第二种方法是否有同样的true?
console.log(str.indexOf===String.prototype.indexOf)//true console.log(str1.indexOf===String.prototype.indexOf)//true
但是:
strinstanceofString//false str1instanceofString//false
str又不属于String却拥有String的方法?????
因为:
这是JS中的设计。
这是JS中的设计。
这是JS中的设计。
原始资料类型的方法与属性是"借"来的
一个原始的资料类型值,并没有如对象会有属性或方法,
原始的资料类型在运算时用的属性与方法,是向包装对象"借来"的用的,
所以原始资料类型是可以向newString()或者newNumber()借来所有的方法。但是自己本身却没有属性和方法。
所以这也就是为什么第一种第二种我们无法去自定义属性却可以使用对应类型的方法的原因
总结:
1.第一种和第二种方法定义出来的是原始资料类型
并储存于栈中,
并向包装对象(new..())借来方法和属性.
2.第三种是包装对象,
栈中储存堆指针,
堆中储存内容。
所以这也是发生一系列看似不正常但是又正常的事情的原因,
哈哈哈哈哈哈哈哈。
当然还有很多的东西,既然牵扯到了堆栈,
那么又不得不了解一下堆栈到底是什么,
有什么区别等等。
好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。