基本概念
一、语法
一)区分大小写
二)标识符
书写规则同Java
三)注释
略
四)严格模式
1.在整个脚本中启用严格模式:在顶部添加
"use strict"
2.指定函数在严格模式下执行:
function doSth() {
"use strict"
//函数体
}
二、变量
ECMAScript变量类型是松散类型,所谓松散类型就是可以保存任何类型的数据。
//定义变量
var msg;
//注意由var定义的变量是局部变量,如果变量在函数中函数退出后变量就会被销毁 //省略var定义并初始化一个全局变量
msg2 = "Hi"
//不推荐在函数中定义全局变量,因为在局部作用域中定义全局变量很难维护,
//函数中的全局变量也会因为不会马上就用定义导致不必要的混乱 //定义多个
var a = 1,b = 'yes',c = 5;
三、数据类型
五种基本数据类型:Null,Undefined, Boolean, Number, String
一种复杂数据类型:Object,Object本质上是由一组无序的名值对组成。
ECMAScript不支持任何创建自定义类型机制,所以所有的类型最终都将是上述6种类型之一。
typeof操作符:用于检测变量类型。对一个值使用该操作符会返回下列字符串之一:
1."undefined":
2."boolean"
3."string"
4."number"
5."object":如果该值是对象或者null
6."function"
一)Undefined类型
Undefined类型只有一个值:undefined
var msg;
var name = undefined;
console.log(msg == undefined); //true
console.log(name === undefined); //true
// console.log(age); //报错----"age is not defined"
console.log(typeof age); //"undefined"-----对于未声明的变量,只能执行该操作
所以,显示地初始化变量是最吼的!!!!+1s
二)Null类型
Null也只有一个值:null。
undefined派生于null
alert(null == undefined); //true
三)Boolean类型
要将一个值转换为Boolean类型可以调用Boolean()函数。
各种类型转换为Boolean类型
数据类型 转换为true的值 转换为false的值
String 任何非空字符串 ""即空串
Number 任何非零数字 0和NaN
Object 任何Object null
Undefined n/a (不适用) undefined
注意:
var msg = "hi";
if (msg) { //自动转换为Boolean类型
console.log("msg is true");
}
四)Number类型
console.log(typeof Infinity); //number
console.log(typeof NaN); //number
1.整数
可以是十进制八进制(八进制严格模式无效)十六进制
var a = 070 //八进制56
var b = 079 //无效的八进制,解析为79
2.浮点数
var a = 1.0 //自动解析为1
var b = .123 //有效不推荐
var c = 1.23e3 // if (0.3+0.2 == 0.5) { //因为浮点数计算时精度问题,不要这样做
}
3.数值范围
最小:Number.MIN_VALUE 最大:Number.MAX_VALUE 超出范围自动转换为Infinity,Infinity不能参与数值计算。
判断是否属于最大与最小之间可以用:isFinite(num)函数。
4.NaN
即(Not a number)是一个特殊数值,表示本来要返回数值而没有返回的情况(这样就不用报错了)。
注意:1.任何涉及NaN的操作都会返回NaN 2.NaN与任何数值都不相等,包括其本身。
isNaN()
console.log(isNaN(NaN)); //true
console.log(isNaN("Yellow")); //true
console.log(isNaN("100")); //false
5.数值转换
1.Number()函数:
可用于任何数据类型
Boolean值分别转换为1和0
null转换为0
undefined转换为NaN
字符串:
只包含数值转换为10进制,包含有效的16进制格式转换为10进制,空串转换为0,其余转换为NaN。
如果是对象则先调用valueOf()函数,如果得到NaN则再调用toString()
var num1 = Number("Hello world!"); //NaN
var num3 = Number("000011"); //
2.parseInt()函数:
parseInt()函数会忽略字符串前面的空格,直到找到第一个非空字符,如果第一个字符不是数字或者负号就返回NaN
var num1 = parseInt("1234blue"); //
var num2 = parseInt(""); // NaN
var num3 = parseInt("0xA"); // 10(十六进制数)
var num4 = parseInt(22.5); //
var num5 = parseInt("070"); // 56(八进制数)
var num1 = parseInt("AF",); //
var num2 = parseInt("AF"); //NaN
五)String类型
1.String 类型用于表示由零或多个 16 位 Unicode 字符组成的字符序列,即字符串。字符串可以由双
引号(")或单引号(')表示 (无区别)。
2.ECMAScript 中的字符串是不可变的
3.转换为字符串可用toString()函数,也可用String()函数:
如果值有 toString()方法(null和undefined没有这个方法),则调用该方法(没有参数)并返回相应的结果;
如果值是 null,则返回"null";
如果值是 undefined,则返回"undefined"。
三)Object类型
ECMAScript中类型是所有他的实例的基础,即Object具有的所有方法和属性同样存在于更具体的对象中。
Object每个实例具有的方法和属性:
1)constructor:保存着创建当前对象的函数,比如,Object()
2)hasOwnProperty(propertyName):用于检查给定的属性在对象实例中(而不是实例的原型中)是否存在。其中propertyName必须以字符串的形式指定。
3)propertyIsEnumerable(propertyName):检查给定的语句能否用for-in语句来枚举。同样propertyName必须是字符串。
4)toLocalString()
5)toString()
6)valueOf()
注意:从技术角度讲, ECMA-262 中对象的行为不一定适用于 JavaScript 中的其他对象。浏览器环境中的对象,比如 BOM 和 DOM 中的对象,都属于宿主对象,因为它们是
由宿主实现提供和定义的。 ECMA-262 不负责定义宿主对象,因此宿主对象可能会也可能不会继承 Object。
三、操作符
1.布尔操作符特别的地方
1)逻辑与(&&):
如果第一个操作数是对象,则返回第二个操作数;
如果第二个操作数是对象,则只有在第一个操作数的求值结果为 true 的情况下才会返回该
对象;
如果两个操作数都是对象,则返回第二个操作数;
如果有一个操作数是 null,则返回 null;
如果有一个操作数是 NaN,则返回 NaN;
如果有一个操作数是 undefined,则返回 undefined。
2)逻辑与(||):
如果第一个操作数是对象,则返回第一个操作数;
如果第一个操作数的求值结果为 false,则返回第二个操作数;
如果两个操作数都是对象,则返回第一个操作数;
如果两个操作数都是 null,则返回 null;
如果两个操作数都是 NaN,则返回 NaN;
如果两个操作数都是 undefined,则返回 undefined。
四、语句
for in 对对象的属性进行遍历,其顺序不可预测。
label语句:
var num = 0;
outermost:
for (var i=0; i < 10; i++) {
for (var j=0; j < 10; j++) {
if (i == 5 && j == 5) {
break outermost;
}
num++;
}
}
alert(num); //
使用with语句会导致性能下降,调试困难,不建议使用。
switch语句
可以在switch()括号中使用任何类型,case中也不一定是常量,可以是变量或者表达式。
注意:switch语句在比较时使用的是全等符,因此不会发生类型转换。
五、函数
语法:
function funName() {
//doSth
}
注意:
1.调用函数时必须带上括号
2.不必指定返回值,当然也可以指定
3.return语句不带任何返回值时,函数在停止后返回undefined
4.函数参数可以是任意多个,调用函数时可以传递任意多个参数,不一定与定义时相等,
因为这个特性ECMAScript中函数不能重载,后定义的函数会覆盖先定义的函数。
之所以会出现4中的情况,ECMAScript函数在函数内部时用一个类似数组的arguments对象来表示的,可以像用数组一样使用arguments对象。
我们可以根据arguments的长度实现一个伪重载:
function doAdd() {
if(arguments.length == 1) {
alert(arguments[0] + 10);
} else if (arguments.length == 2) {
alert(arguments[0] + arguments[1]);
}
}