语句与表达式
表达式会产生一个值,而语句不会。
js 中有两种像语句的表达式
对象字面量
{
foo:test()
}
该语句即可认为是一个创建对象的表达式。
也可以认为是一个代码块(语句):
- 一个代码块:一个由大括号包围的语句序列.
- 一个标签:你可以在任何语句前面放置一个标签.这里的foo就是一个标签.
- 一条语句:表达式语句 test().
函数声明与函数表达式
函数声明是声明一个函数,可以在任何地方使用该函数,因为解释器会将该函数声明提到了前面。
函数表达式指的是定义一个函数,并将函数赋值给别的变量。
function test(){
return "aaaa"
}
该语句即可认为是一个函数声明,也可认为是一个函数表达式 —— 定义一个函数,并将其赋值给 test 。
js 中,凡是 function 开头的语句,都是函数声明,其余的是函数表达式。
总结
因此,在实际使用中 表达式不能以花括号,function开头。
console.log(eval("{foo:123}"));
console.log(eval("({foo:123})"));
前者输出 123,因为 {foo:123} 被认为是一个语句,foo 是一个标签。后者输出 {foo: 123}
,因为加一层小括号后解析器会认为其为一个表达式:定义一个对象。
严格模式
严格模式激活更多的警告以及使 js 更干净
在 js 文件第一行或<script> 标签第一行或方法第一行输入'use strict';
。
数据类型
分类 | 值 |
---|---|
基本数据类型 | boolean,数字,字符串,null ,undefined |
对象 | 其余全部 |
- 基本数据类型按值比较,其属性不能被改变、添加或删除。
> var str = 'ab'
> str.length
2
> str.length = 3 // 不可改变
> str.length
2
> str.foo = 3 // 无法定义
> str.foo
undefined
-
null,undefined, false,0,NaN 和空字符串都被看作 false。
-
所有的数字都是浮点型。数字中含有 NaN(不是一个数字,如将 xxx 解析成数字时,返回的结果就是 NaN),Infinity 表示最大值,-Infinity 表示最小值。
null 与 undefined
undefined 表示未被初始化。访问不存在的属性也是 undefined。
null 表示没有对象。但其有值,其值为 null。
typeof 与 instanceof
-
typeof 返回一个表示当前值的类型的 字符串。要注意:
typeof null
返回的是 object,函数返回 function。 -
instanceof 与 java 一样。但
undefined instanceof Object
为 false,null instanceof Object
也为 false。
字符串
-
可以通过下标获取单个字符,下标越界时返回 undefined:
'fdas'[3]
的结果是 s。
函数
函数参数太多,会被忽略;参数太少,未赋值的形参会是 undefined 。
作用域
-
变量的作用域总是 完整的函数。
-
所有变量的声明都会被提升:声明会被移动函数的开始处,而赋值仍然会在原地。
function f() {
console.log(temp); // 输出 undefined,说明 temp 已被定义,但未被赋值
console.log(aa); // 此句会报错: aa is not defined
var temp = 3
}
arguments
用于保存函数中所有实参。
js 中函数没有重载,任何函数可以传任意数目的参数,所有参数都会保存在 arguments 中。
arguments 看起来像数组,可以使用 length 读取长度,使用下标获取参数值。但不具备别的数组功能
argments.callee 表示当前函数,可以用于实现递归。
function f() {
console.log(arguments.length) // 4
console.log(arguments[3]) // 4
}
f(1,2,3,4)
对象与构造函数
-
通过 {} 并写上键值对的方式创建一个对象
-
通过 in 检测属性是否存在
-
通过 delete 删除对象中的属性
function f() {
var o = {
name:'---',
say: function () {
console.log("name is "+this.name)
}
};
o.say();
console.log('name' in o); // true
delete o.name;
console.log('name' in o); // false
}
f(1,2,3,4);
- 类名点的方法可以调用明确的属性,如果属性名是变量值或通过表达式计算得到,需要使用 类名[变量名] 形式:
function f() {
var o = {
name:'---',
};
var p = 'name';
console.log(o[p]) // 不能使用 o.p 形式
}
- 通过 new 运算符调用函数时,函数就变成了构造函数。
function Person(x,y){
this.x = x;
this.y = y;
}
var p = new Person(1,2); // Person 为构造函数
数组
-
通过改变 length 属性,可以删除 length 外的元素
-
通过 in 操作符判断指定的下标是否越界。
function test(){
var a = [1,2,3,4,5];
console.log(a);
a.length = 3;
console.log(a); // [1, 2, 3]
console.log(4 in a); // false,下标 4 已越界
}
网友评论