严格模式:在脚本顶部添加 ”use strict”;
变量: 省略 var 可以定义全局变量。
一、数据类型:
基本数据类型:Undefinded、Null 、Boolean 、Number 、String ; 复杂数据类型:Object .
javascript隐藏机制:当把一个基本类型以对象的形式去使用的时候(例如使用length属性,或者添加一些其他属性),javascript会将其转换为所对应的包装类型对象,相 当于new一个string .但是当操作完毕后这个临时包装对象就会被销毁
例子:var a ="string";
alert(a.length);//6
a.t=3;
alert(a.t;)//undefined
类型检测:
typeof : 检测给定变量的数据类型 . typeof null 返回’object’;
函数是对象 不是数据类型;
适合基本类型和函数对象的检测,遇到null失效
[[Class]]
通过{}.toString拿到,适合内置对象和基元类型,遇到null和undefined失效(IE678等返回[object Object])。
Object.prototype.toString.
例子:
Object.prototype.toString.apply([])//"[Object Array]"
Object .prototype.toString.apply(function(){}); //"[Object function]"
Object.prototype.toString.apply(null); //"[Object null]'
...
PS:ie6/7/8下存在兼容性问题,在检测null时会返回object
4)constructor构造器
每个对象都有个constructor属性,它指向该对象的构造函数类型,不过该属性的值可以被改写的,所以用它的判断并不可靠
5)duck type
百度了为啥叫“鸭子类型”,有这样的话:“当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。”
大概意思就是说当某个对象具备某种类型的特征或者行为时就可以被判断为某种类型,不知道是不是“能力检测”那种意思-
适合基本类型及function检测,遇到null失效。
Instanceof
[1,2] instanceof Array ===true;
适合自定义对象,也可以用来检测原生对象,在不同iframe和window间检测时失效。
Undefinded: var message ; 未初始化 等价于 varmessage=undefined;
Var message 没有分号 未声明
Null:只有一个值 null 表示一个空对象指针
意在保存对象的变量还没真正保存变量,则设置null;
Boolean: true 、false 区分大小写
转型函数:Boolean(); P26: 转换规则。
Number类型:
1、整数 、浮点数值
整数:十进制 、
十六进制 :前两位必须是0x (0xA :10)
八进制 :第一位是0,然后是0-7 ,如果超出范围 前导0将被忽略 后面的数被当作十进制数解析(076:56,079: 79);
浮点数值:必须有一位小数
e7 表示10的7次;
永远不要测试某个特定的浮点数值,关于浮点数值计算会产生舍入误差。
2 、 数值范围:
最小数值Number.MIN_VALUE 5e-324;
最大数值Number.MAX_VALUE 1.7976931348623157e+308;
负无穷:-Infinity; 正无穷:Infinity;
isFinite(): 确定数值是不是有穷的 返回true 则表明有穷;
3、NaN: 非数值是一个特殊的数值本来要返回数值的操作数未返回数值;
任何数值除以非数值回返回NaN ;
NaN 与任何值不相等 包括NaN本身;
IsNaN(): 接受一个参数(任何类型) 判断其是否 ’不是数值’;所以不能被转换成数值的值都会导致返回true;
4、数值转换
Number()、parseInt()、
Number():可以用于任何数据类型,P30: 转换规则。
常见:”hello world” :NaN ;
“ ” : 0;
“000011” : 11;
“true” : 1;
parseInt() :将字符串转换成整数;
忽略字符串前面的空格,直到找到第一个非空格字符,如果第一
个字符不是数值或者负号 则返回NaN; 例: parseInt(“”); 返回NaN ;
指定基数:parseInt(“ ”, 10); 转换为十进制数;
parseFloat():将字符串转换成浮点数值;
会忽略前导0;
只有第一个小数点有效;
十六进制数格式的字符串会被转换成0;
只解析十进制值,因此不需要指定基数 ;
String类型 :特殊字符字面量(转义序列);
特点:字符串不可变 ,要想改变 首先要销毁原来的字符串,再用新值填充;
toString():转换为字符串, null 和undefined 没有这个方法;
Object类型: 是一组数据和功能的集合;P35 :属性和方法;
常用:toString();value Of();
BOM 、DOM中的对象都属于宿主对象;
二、操作符:
1、一元操作符:前置型 、后置型;P37:规则; 浮点数值计算会产生舍入误差。
a. 执行前置递增和递减,变量的值是在语句被求值前改变的(副效应);
Var num1=2;
Var num2=20;
Var num3= - - num 1+num2 ; //21;
Var num4= num1 +num2; //21
b. 执行后置递增和递减,变量的值是在语句被求值后改变的;
Var num1=2;
Var num2=20;
Var num3= num 1 -- + num2 ; //22
Var num4= num1 +num2; //21
2、布尔操作符:
逻辑非!;逻辑与 &&;逻辑或:||;
3、乘性操作符:
乘法 :* ;
除法:/ ;
求模:% ;
4、加性操作符:
“37”+7; // “377”
一个数值和一个字符串相加成一个字符串;
“37”-7 // 30
Num + ”” ;变量转换为字符串;
Num – 0 ;变量转换为数值
5、 关系操作符:
< > >= <= 返回布尔值;
6、相等操作符:
相等和不相等: == 、!= 先转换再比较; null == undefined;
全等和全不等:===、 !== 仅比较不转换; null ===null ; “55”!==55; 不同数据类型;
7、条件操作符: var value = exp ? trueExp : falseExp。 相当于var value=null; if(exp){ value =trueExp;}else{value = falseExp;}
8、赋值操作符:
+=、-=、*=、/=、%= <<=、>>=、>>>=
9、逗号操作符:
使用逗号可以再一条语句中执行多个操作;
在用于赋值时 操作符总会返回表达式中的最后一项;
Var num=(1,2,3,4); // 4
三、语句
注意:由于不存在块级作用域,因此在循环内部定义的变量在外部可以访问
1.if () else ;
2.do while ; 后测试循环语句,至少执行一次;
3.while ;前测试循环语句,有可能一次都不执行;
4.for( 初始化 ;表达式 ;循环语句 ){ };
5. for(变量 in 对象){};精准的迭代语句,用来枚举对象的属性;
例: for(var index in arr){};
for(var properties in naviqator){};
如果对象值为 null 、undefined 则不执行循环体
6. 添加标签:lable :statement; 可以有break 、continue引用
例:Start :for( ; ; ){ };一般与for语句等循环语句配合使用;
7. break: 立即推出循环体;
continue:推出循环体,从循环体顶部继续执行;
8. with:将代码的作用域设置到一个特定的对象中
With( 对象) { 多个 statement ;}
严格模式下不允许使用with语句;
9. 与if最亲密: switch (expression){
case value1:
statement1;
break;
case value2:
statement2;
break;
default: //相当与else
statement3;
}
注意:可以在switch语句中使用任何数据类型;
Case 的值可以是常量 、变量、 表达式;
在比较值的时候,使用的是全等操作符;
函数:
通过return语句可以给函数一个返回值,也可以不带任何值(返回值:undefined),停止并跳出当前函数;位于return后的语句不执行;
严格模式对函数的限制:
不能把函数名 参数 命名为eval 或arguments ,且不能出现两个命名参数同名的情况
参数:
1. 在内部是通过一个数组表示的;参数值可以通过arguments[i]来获取;
2.arguments.length:可以获知有多少个参数传给函数;
实现重载作用:
function funcName(){
if(arguments.length== 1){
statement;
}else if(arguments.length== 2){
statement;
}
}
3. arguments 对象可以和命名参数一起使用,与对应命名参数的值保持同步;且可以改变其值,如果只有一个参数则改变不了,严格模式下则无效;
4. 没有传递值的命名参数,自动赋值undefined;