js的一些理解

javascript:一种单线程的解释性脚本语言(在执行的时候,解释一句一句执行一句)

javascript:一种单线程的解释性脚本语言(在执行的时候,解释一句一句执行一句)

js运行三部曲:

1.语法分析

语法分析过程:通篇扫描代码,看是否有低级的错误:如少写一个大括号、出现中文等,然后开始预编译

2.预编译

预编译过后再开始解释执行代码

3.解释执行

预编译四部曲:

下面的步骤从1到4依次执行

1.创建AO(执行期上下文)对象
2.找形参和变量声明,将变量和形参名AO的属性名,值为undefined
3.将实参值和形参值统一
4.在函数体里找函数声明,值赋予函数体

例子

下面的例子都可以按照上面的预编译四部曲分析得到结果

1、例一

1
2
3
4
5
6
7
8
9
10
function bar() {
return foo;
foo = 10;
function foo() {

}
var foo = 11
}

console.log(bar()) //输出:foo(){}

2、例二

1
2
3
4
5
6
7
8
9
console.log(bar()) // 输出:11
function bar() {
foo =10;
function foo() {

}
var foo =11;
return foo
}

3、例三

1
2
3
4
5
var a =123;
function a() {

}
console.log(a)// 输出123

4、例四

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
  function fn(a){
console.log(a) // function a(){}

var a = 123;
console.log(a)// 123

function a(){}

console.log(a)// 123

var c = function (){}

console.log(c)// function (){}

function d(){}
}
fn(1)

20181014更新

包装类

在js中,变量可以存在两种类型的值,即原始值和引用值,

原始值没有属性和方法,原始值在调用属性时会隐式调用包装类

例一:

1
2
3
var num = 4; // num 是一个number原始值
num.len = 2; // 此时程序不会报错,因为会隐式调用一个包装类然后添加这个属性new Number(mum).len = 2,执行完后立即delete销毁
console.log(num.len) // 此时重新调用包装类new Number(mum).len,所以返回undefined

例二:

1
2
3
4
5
6
var str = 'abcd'
str.length = 2;// 调用new String(str).length = 2,然后立即delete
销毁

console.log(str) // 返回 abcd
console.log(str.length) // 调用new String(str).length,返回 4

例三:

1
2
3
4
5
6
7
8
9
var str = 'abc'
str +=1
console.log(str)
var test = typeof str;
if(test.length ** 6 ){
test.sign = 'sssss'
//原始值添加属性需要调用包装类,new String(test).sign = 'ssss'
}
console.log(test.sign) // 相当于new String(test).sign,所以结果为undefined

类数组

简单总结:

  1. 有length属性;
  2. 属性为非负整数
    例:
    1
    2
    3
    4
    5
    var obj = {
    '0' : 'abc',
    '1' : 'bcd',
    length : 2
    }