堆栈内存
概念
- 浏览器想要执行js代码:
-
从电脑内存中分配除一块内存,用来执行代码(栈内存=> Stack)
-
分配一个主线程用来自伤而下执行js代码
a = b = 3 => a=3, b=3
面试题
- 写出下面结果输出的答案 (阿里面试题)
let a = {
n: 1
};
let b = a;
a.x = a = {
n: 2
};
console.log(a.x); //=>undefined
console.log(b); //=> {n:1, x:{n:2}}
- 分别写出下列表达式输出的结果 (腾讯面试题)
var a = 'abc' + 123 + 456;
//=>解析:'abc为字符串,接下来都是字符串拼接'
//=> 'abc123456'
var b = '456' - '123';
//=>解析: 减法,都要转成Number
//=>333
var c = 100 + true + 21.2 + null + undefined + "Tencent" + [] + null + 9 + false;
//=>解析:
// c = 100 + 1 + 21.2 + 0 + NaN + "Tencent" + '' + 'null' + '9' + 'false'
//'NaNTencentnull9false'
console.log(a,b,c);
- 写出下列代码的输出结果 (腾讯面试题)
var str = 'abc123';
var num = parseInt(str); //=> NaN
//=>解析: NaN 和任何东西都不相等,包括它自己本身,但是它属于number类型,
if (num == NaN) {
alert(NaN);
} else if (num == 123) {
alert(123);
} else if (typeof num == 'number') {
alert('number');
} else {
alert('str');
}
//=>'number'
4.写出下列代码的输出结果 (腾讯面试题)
var a = 0;
var b = a;
b++;
alert(a) //=>0
var o = {};
o.a = 0;
var b = o;
b.a = 10;
alert(o.a) //=> 10
- 能输出”1”的有哪些?
alert(1) //=>输出的是"1",因为基于alert/confirm等输出结果,都会把内容转换为字符串再输出
console.log(parseInt(1.3)) parseInt('1.3') =>1
console.log(1) //=>1 console.log输出的内容还是原本的数据格式
// console.log(isNaN(1)) //=>false
// console.log(parseInt("1")) //=>1
- 下面结果是”undefined”的是
console.log(alert(1));
//=>先执行ALERT(输出"1"),然后把ALERT执行的返回结果再输出 =>undefined
typeof undefined; //=>"undefined" typeof返回的结果首先是一个字符串
console.log(parseInt(undefined)); //=>parseInt(undefined) =>parseInt("undefined") =>NaN
isNaN(undefined); //=>isNaN检测值,如果值不是数字类型,先基于Number把其转换为数字类型,然后再检测 =>Number(undefined) =>NaN =>isNaN(NaN) =>true
- 下面结果能得到true的是
isNaN(null) //=>isNaN(0) =>false
isNaN(parseInt(null)) //=>parseInt("null") =>NaN =>isNaN(NaN) =>true
Number(null) //=>0
parseFloat(null) //=>parseFloat("null") =>NaN
- 输出下面程序的结果
// Number和parseInt在转换为数字的时候,规则是不一样的
parseInt("") //=>NaN
Number("") //=>0
isNaN("") //=>需要先调用Number转换为数字再检测 isNaN(0) =>false
parseInt(null) //=>先把值转换为字符串 parseInt("null") =>NaN
Number(null) //=>0
isNaN(null) //=>isNaN(Number(null)) => isNaN(0) =>false
parseInt("12px") //=>12
Number("12px") //=>NaN
isNaN("12px") //=>isNaN(Number('12px')) =>isNaN(NaN) =>true
- 下面程序输出的结果
if (isNaN(NaN) == "") {
console.log("珠峰")
} else {
console.log("培训")
}
//=>'培训'
- 下面程序输出的结果
let x = [1, 2, 3];
let y = x;
let z = [4, 5, 6];
y[0] = 10;
y = z;
z[1] = 20;
x[2] = z = 30;
console.log(x, y, z);
// 解析:
/*
AAAFFF000: [1,2,3]=>[10,2,3]=>[10,2,30]
AAAFFF111: [4,5,6]=>[4,20,6]
x-> AAAFFF000
y-> AAAFFF000
z-> AAAFFF111
y-> AAAFFF111
z-> 30
x: [10,2,30]
y: [4,20,6]
z: 30
*/
关于9题的知识点
- 在JS中,比较两个值是否相等,我们有以下几种方式
-
== 相等(相等比较中,如果左右两边数据类型不同,则默认先转换为相同的数据类型,然后再进行比较)
-
==== 绝对相等(需要保证左右两边数据类型和值都一样,才会相等,只要有一样不一样,结果都是不相等的)
-
Object.is ES6规范中新增加的方式(暂时不讲) // console.log(10 == "10"); //=>TRUE 默认先把"10"->10,然后再比较
// console.log(10 === "10"); //=>FALSE
// console.log("10" === "10"); //=>TRUE -
isNaN(NaN) == "" 条件是否成立
- isNaN(NaN) =>true
- true=="" 两个等于号比较,默认会转换数据类型(此处都转换为数字,再进行比较) => 1==0 条件是不成立的