部分与编译型语言有区别的语法
数据类型
NaN:表示不是数字
undefined:未初始化
表达式:
==
:不严格的判等 “10” == 10 true
===
:严格的判等 “10”===10 false
!==
!===
分支结构
switch 语句中 用的是严格的判等
数组
声明方式:
var array = new Array(); // 空数组
var array = new Array(10); // 内容为undefined
var array = new array(10,20,30); //number数组
var array = []; //空数组
var array = [10,20,30]; //number数组
数组长度可以改变
var array = []; //声明一个空数组
var array[0] = 10; //往里面添加元素
var array[1] = 20;
console.log(array.length) //数组长度改变
函数
- 定义
//声明
function fun(){
}
//参数不需要声明类型(没法声明类型)
function fun(x,y){
}
//如果没有返回值或return; 则会得到一个undefined
console.log(fun(1,2));
- arguments对象
arguments就是参数列表的数组(伪数组)
function fun(){
//此操作可以显示传入的参数长度,即使函数参数列表没有声明。
console.log(arguments.length);
console.log(arguments);//打印参数列表的值
}
fun(1,2,3);
- 命名函数与匿名函数
var fun = function () {
}
这种方式叫函数表达式
普通同名函数,后定义的函数会覆盖前面的函数,而函数表达式和变量赋值类似。
4. 函数自调用
(function () {
console.log("aaaa")
})();
- 函数作为参数使用:
function f1(f2) {
f2();
console.log("bbbb");
}
function f2() {
console.log("aaaa");
}
f1(f2);
- 函数作为返回值使用
function f1() {
return function () {
console.log("aaaa");
}
}
var ff = f1();
ff();
总结:
函数名的本质就是函数体。
函数的数据类型是function。
JS中的作用域
- 两个script标签可以使用一个变量
** js里没有块级作用域
只有函数中声明的吧变量是局部变量,其他任何位置声明的变量都是全局变量。
<script>
var num = 1;
</script>
<script>
alert(num); //1
</script>
- 隐式全局变量
function f() {
num = 10; //不用var声明.
delete num;
}
//可以访问到函数内的变量,因此此函数不会被释放内存
console.log(num);
//delete 关键字可以删除隐式全局变量
delete num;
//但无法删除var声明的变量
JS中的预解析
js代码会预先声明变量,只要变量被声明,无论变量在什么位置,解释器会提前声明,
函数会调整顺序,无论函数体在什么位置,只要有这个函数,就能被整确调用。
注意
var num = 1;
function f1() {
//隐式的var num;
console.log(num); //此结果仍然是undefined 因为js会预解析
var num = 20;
}
f1();
f1();
var num = 1; //函数会被提前,这个变量的声明也会提升到变量使用之前
function f1() {
console.log(num); //此结果仍然是undefined
}
function f1() {
console.log(num); //此结果仍然是undefined
var num = 1;
}
f1();
console.log(num); //报错、提升只会在作用域里面进行
//多个标签预解析不冲突(各标签各玩各的)
<script>
f1(); //aaaa
function f() {
console.log("aaaa");
}
</script>
<script>
f1(); //bbbb
function f() {
console.log("bbbb");
}
</script>
console.log(a); // a的函数体
function a() {
console.log("123");
}
var a = 10;
console.log(a); //10;
//提升时,总是变量在前,函数在后进行提升
```