console.log

JS 一些基本概念

  • 数据类型
  1. 基本类型:numberbooleanstringundefinednull
  2. 引用类型:arrayobjectfunction
  • typeof 返回 六 种值

numberbooleanstringobjectfunctionundefined

  • 六种情况下返回值为 false

false0undefinednull""NaN

  • 其他
null < 0null > 0null == 0 // 均为 false
undefined < 0undefined > 0undefined == 0 // 均为 false
null == undefined // true

{} == {} // false
[] == [] // false
复制代码

运行逻辑

JS 运行三部曲:语法分析、预编译、解释执行

  • 语法分析:通篇执行一遍,看有木有问题,有问题直接报错

语法问题报错:Uncaught SyntaxError
逻辑问题报错:Uncaught ReferenceError

  • 预编译:( 预编译发生在函数执行的前一刻 )
  1. 创建 AO 对象;(AO:Activation Object 执行期上下文)
  2. 找到形参和变量声明,将变量和形参名作为 AO 属性名,值为 undefined
  3. 将实参值和形参统一
  4. 在函数体里面找函数声明,值赋予函数体

变量与函数

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
喜欢就支持一下吧
点赞0 分享