javascript:一种单线程的解释性脚本语言(在执行的时候,解释一句一句执行一句)
js运行三部曲:
1.语法分析
语法分析过程:通篇扫描代码,看是否有低级的错误:如少写一个大括号、出现中文等,然后开始预编译
2.预编译
预编译过后再开始解释执行代码
3.解释执行
预编译四部曲:
下面的步骤从1到4依次执行
1.创建AO(执行期上下文)对象
2.找形参和变量声明,将变量和形参名AO的属性名,值为undefined
3.将实参值和形参值统一
4.在函数体里找函数声明,值赋予函数体
例子
下面的例子都可以按照上面的预编译四部曲分析得到结果
1、例一
function bar() {
return foo;
foo = 10;
function foo() {
}
var foo = 11;
}
console.log(bar()) //输出:foo(){}
2、例二
console.log(bar()) // 输出:11
function bar() {
foo =10;
function foo() {
}
var foo =11;
return foo
}
3、例三
var a =123;
function a() {
}
console.log(a)// 输出123
4、例四
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中,变量可以存在两种类型的值,即原始值和引用值,
原始值没有属性和方法,原始值在调用属性时会隐式调用包装类
例一:
var num = 4; // num 是一个number原始值
num.len = 2; // 此时程序不会报错,因为会隐式调用一个包装类然后添加这个属性new Number(mum).len = 2,执行完后立即delete销毁
console.log(num.len) // 此时重新调用包装类new Number(mum).len,所以返回undefined
例二:
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
例三:
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
类数组
简单总结:
- 有length属性;
- 属性为非负整数
例:
var obj = {
'0' : 'abc',
'1' : 'bcd',
length : 2
}