JS中String 与new String 的差异浅析

首先给大家分享一个巨牛巨牛的人工智能教程,是我无意中发现的。教程不仅零基础,通俗易懂,而且非常风趣幽默,还时不时有内涵段子,像看小说一样,哈哈~我正在学习中,觉得太牛了,所以分享给大家!点这里可以跳转到教程

                    

今天看到这样的面试题,如下:

var yiifaa = 'yiifaa',    str1 = new String(yiifaa),    str2 = String(yiifaa)
  
  
  • 1
  • 2
  • 3

声明与赋值了3个变量,然后考题如下:

//  请确认以下的判断是否准确str1 === yiifaa//str2 === yiifaa//typeof str1 === typeof str2
  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

根据JS的语法,要满足===的条件如下:
1. 如果是引用类型,则两个变量必须指向同一个对象(同一个地址);
2. 如果是基本类型,则两个变量除了类型必须相同外,值还必须相等。

再把话题切换到String对象上来,String的声明方式有三种(请参见第一段代码),但产生的类型却不尽相同,结果如下:

//  类型为string,为基本类型typeof yiifaa//  类型为object,为引用类型typeof str1//  类型为string,为基本类型typeof str2
  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

那现在答案很清楚了,如下:

//  false, 因为str1为引用类型str1 === yiifaa//  true, 因为都是基本类型,并且值相等str2 === yiifaa// false, 虽然都是字符串,但分别为object与stringtypeof str1 === typeof str2
  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

总结

很神奇的String对象,一方面可以作为基本类型,另一方面还可以作为引用类型,更神奇的是,为String.prototype添加方法,基本类型还可以引用到,怎么做到的?

对比JAVA的Integer对象的实现,利用int声明的变量可不能调用Integer的方法,所以还不是装箱操作。

最后关于一个函数既可以作为普通函数调用,也可以作为构造函数调用,实现方法如下:

function User(username) {    this.username = username    //  这肯定是作为函数调用,但在服务端判断需要改进    //  必须要进行判断,否则死循环    if(this === window) {        return new User(username)    }}
  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

改进的方法如下:

function User(username) {    //  一定是调用了构造函数    if(this.inst === "User") {        this.username = username    } else {        return new User(username)    }}//  为User的上下文添加标记User.prototype.inst = "User"
  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
           

浏览人工智能教程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值