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