JS 一些基本概念
- 数据类型
- 基本类型:
number
、boolean
、string
、undefined
、null
- 引用类型:
array
、object
、function
、
- typeof 返回 六 种值
number
、boolean
、string
、object
、function
、undefined
- 六种情况下返回值为 false
false
、0
、undefined
、null
、""
、NaN
- 其他
null < 0、 null > 0、null == 0 // 均为 false
undefined < 0、undefined > 0、undefined == 0 // 均为 false
null == undefined // true
{} == {} // false
[] == [] // false
复制代码
运行逻辑
JS 运行三部曲:语法分析、预编译、解释执行
- 语法分析:通篇执行一遍,看有木有问题,有问题直接报错
语法问题报错:Uncaught SyntaxError
逻辑问题报错:Uncaught ReferenceError
- 预编译:( 预编译发生在函数执行的前一刻 )
- 创建 AO 对象;(AO:Activation Object 执行期上下文)
- 找到形参和变量声明,将变量和形参名作为 AO 属性名,值为 undefined
- 将实参值和形参统一
- 在函数体里面找函数声明,值赋予函数体
变量与函数
console.log(a);
var a = 123; // 将 var 变成 let 将如何?
复制代码
结果:undefined、 报错 b is not defined
因为:变量是 声明提升;let 有自己单独的作用域,不存在声明提升,即 作用域死区
test()
function test() {
console.log(123)
}
复制代码
结果:123
因为:函数声明整体提升
global = 100;
function fn() {
console.log(global);
global = 200;
console.log(global);
var global = 300; // 将 var 去掉将如何?
}
fn();
复制代码
结果:undefined 和 200、100 和 200
因为:当函数 fn 中有 var 声明的 global 时,此时该函数可理解为已经是有 global 的一个小的作用域,全局变量的 global 不会影响函数内的值;如果将 var 去掉,那函数内外的 global 均属于全局,所以可被赋值和修改
function fn(a) {
console.log(a);
var a = 123;
console.log(a);
function a(){};
console.log(a);
var b = function(){};
console.log(b);
function d(){};
};
fn(1);
复制代码
结果:ƒ a(){}、123、123、ƒ (){}
因为:根据 JS 预编译过程可推得
预编译执行逻辑
// 第一步、第二步:
AO: {
a: undefined,
b: undefined,
}
// 第三步:
AO: {
a: 1,
b: undefined
}
// 第四步:
AO: {
a: function a(){},
b: function(){},
d: function d(){}
}
复制代码
JS 基本类型和引用类型赋值问题
var a = 1;
function foo(x) {
x = 2;
}
foo(a);
console.log(a);
复制代码
结果:1
因为:JS 的基本类型,是按值传递的
var obj = {x : 1};
function foo(o) {
o.x = 3;
}
foo(obj);
console.log(obj.x);
复制代码
结果:3
因为:JS 的引用类型,如果改变引用的值,则会改变其结果
var obj = {x : 1};
function foo(o) {
o = 100;
}
foo(obj);
console.log(obj.x);
复制代码
结果:1
因为:JS 的引用类型,如果重新赋值,则不会改变其结果
let obj = {a: 0};
function fun(obj) {
obj.a = 1;
obj = {a: 2};
obj.b = 2;
}
fun(obj);
console.log(obj);
复制代码
结果:{a: 1}
因为:JS 的引用类型,如果改变引用的值,则会改变其结果;如果重新赋值,则不会改变其结果( 此时 obj={a:2} 已经重新赋值相当于一个新的变量,和之前的入参没有关系 )
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END