【前端面试】变量和类型计算

38次阅读

共计 3099 个字符,预计需要花费 8 分钟才能阅读完成。

1. 题目

1.JS 使用 typeof 能得到哪些类型
=== 和 == 的选择
JS 中有哪些内置函数
JS 变量按存储方式分为哪些类型,并描述其特点
如何理解 JSON

2. 知识点
2.1 值类型和引用类型
值类型(boolean,string,number,null,undefined)
var a = 10;
var b = a;
a = 20;
console.log(b); //10
引用类型(对象,数组,函数)
var a = {x:10}
var b = a;
a.x = 20;
console.log(b); //20
值类型直接把值存储在堆中,把 a 赋值给 b 在内存中是又给 b 开辟了一块新的空间,存储了同样的值。
引用类型分两块存储,先在堆中存储一个实际的值,再在栈中存储一个堆中值的引用地址,指向堆中的对象。把 a 赋值给 b 是在栈中重新开辟一块空间存储的还是相同对象的引用地址,a 和 b 存储的地址相同,指向的对象也相同。当对象值发生改变时,两者会同时改变。
引用类型的值一般都比较大,采用此种存储方式可以节省内存空间。
2.2 typeof 运算符
typeof ‘abc’ //string
typeof 123 //number
typeof true //boolean
typeof undefined //undefined
typeof null //object
typeof {a:10} //object
typeof [1,2,3] //object
typeof console.log() //function
2.3 类型转换
强类型转换:通过 String(),Number(),Boolean(),parseInt()函数强制转换
可能发生隐式类型转换的场景

字符串拼接
使用 ==
if 语句
逻辑循环

一、首先看双等号前后有没有 NaN,如果存在 NaN,一律返回 false。
二、再看双等号前后有没有布尔,有布尔就将布尔转换为数字。(false 是 0,true 是 1)
三、接着看双等号前后有没有字符串, 有三种情况:
1、对方是对象,对象使用 toString() 或者 valueOf() 进行转换;2、对方是数字,字符串转数字;(前面已经举例)3、对方是字符串,直接比较;4、其他返回 false 四、如果是数字,对方是对象,对象取 valueOf() 或者 toString() 进行比较, 其他一律返回 false
五、null, undefined 不会进行类型转换, 但它们俩相等
上面的转换顺序一定要牢记,面试的时候,经常会出现类型的问题。
‘100’==100 // 转换成字符串
”==0 // 转换成 false
undefined == null; // true
1 == true; // true
2 == true; // false
0 == false; // true
0 == ‘ ‘; // true
NaN == NaN; // false
[] == false; // true
[] == ![]; // true
// 在 if 中转换成 false 的:
null
undefined

NaN
0
false
10 && 0 //0 10 转换成 true
” || ‘abc’ //abc ” 转换成 false
!window.abc //true
2.4 null 和 undefined 的区别
null:是被赋值过的对象,刻意把一个对象赋值为 null,故意表示其为空,不应有值,所以对象为 null 是正常的,typeof null 返回 ‘object’,null 可以转换为 0
undefined 表示“缺少值”,即此处应有一个值,但还没有定义;转为数值时为 NaN(非数字值的特殊值) typeof undefined 返回 ‘undefined’
3. 题目解答
3.1 JS 使用 typeof 能得到哪些类型
typeof ‘abc’ //string
typeof 123 //number
typeof true //boolean
typeof undefined //undefined
typeof null //object
typeof {a:10} //object
typeof [1,2,3] //object
typeof console.log() //function
3.2 === 和 == 的选择
jquery 源码中的写法:
除了以下方式其他全部使用 ===
if(obj.a == null){
// 相当于 obj.a === undefined || obj.a === null
}
3.3 JS 中有哪些内置函数
单纯作为语言来说,不考虑 node 和浏览器 web

Object
Array
Boolean
Number
String
Function
Date
RegExp
Error

内置对象:Math,JSON
3.4 JS 变量按存储方式分为哪些类型,并描述其特点
值类型何引用类型
3.5 如何理解 JSON
JSON 是 JS 中的一个内置对象
区别

JS 对象 {x:10}
JSON 对象 {‘x’:10}
JSON 串 “{‘x’:10}”

// 将 JS 对象转换成 json 串
JSON.stringify({x:10});
// 将 json 字符串转换成 json 对象
JSON.parse(“{‘x’:10}”);
3.6 严格模式
目的
消除 Javascript 语法的一些不合理、不严谨之处,减少一些怪异行为; 消除代码运行的一些不安全之处,保证代码运行的安全;
提高编译器效率,增加运行速度;
为未来新版本的 Javascript 做好铺垫。
特性
”use strict”;
可以选择放在一个函数中或自定义作用域中。
禁止 this 指向全局对象
function f(){
return !this;
}
// 返回 false,因为 ”this” 指向全局对象,”!this” 就是 false
function f(){
”use strict”;
return !this;
}
// 返回 true,因为严格模式下,this 的值为 undefined,所以 ”!this” 为 true。
创设 eval 作用域
正常模式下,Javascript 语言有两种变量作用域(scope):全局作用域和函数作用域。严格模式创设了第三种作用域:eval 作用域。正常模式下,eval 语句的作用域,取决于它处于全局作用域,还是处于函数作用域。严格模式下,eval 语句本身就是一个作用域,不再能够生成全局变量了,它所生成的变量只能用于 eval 内部。
”use strict”;
var x = 2;
console.info(eval(“var x = 5; x”)); // 5
console.info(x); // 2
全局变量显式声明
v = 1; // 报错,v 未声明
for(i = 0; i < 2; i++) {// 报错,i 未声明
}
禁止删除变量
严格模式下无法删除变量。只有 configurable 设置为 true 的对象属性,才能被删除。
”use strict”;
var x;
delete x; // 语法错误
var o = Object.create(null, {‘x’: {
value: 1,
configurable: true
}});
delete o.x; // 删除成功
函数不能有重名的参数
保留字
为了向将来 Javascript 的新版本过渡,严格模式新增了一些保留字:implements, interface, let, package, private, protected, public, static, yield。使用这些词作为变量名将会报错。
function package(protected) {// 语法错误
”use strict”;
var implements; // 语法错误
}
3.7 eval
1. 没有必须使用的应用场景
2. 不容易调试,可读性不好
3. 在旧的浏览器中如果你使用了 eval,性能会下降 10 倍。
4. 容易 xss

正文完
 0