原始类型:
基本类型:number string boolean null undifined object
object分为 Function Array Date
number string boolean 又有包装类型
new String('string'); 就是包装类型
var str1='string';
var str2=new String('string'); 包装类型
包装类型可以有对应的方法
demo
str2.length //6
str2.a=10;
console.log(str2.a);//10
基本类型也可以这样使用
str1.length//6
str1.a=10;//10
console.log(str1.a);//undifined
原理:
基本类型在调用包装类型的方法时,类型创建基本类型的包装类型,在调用完之后,立即销毁这个临时的包装类型。所以在输出str1.a时结果是undifined
number boolean 同上
var num1=123;
num1.tostring()number转string也是这个原理
类型检测
typeof 运算符
instanceof 运算符
Object.prototype.toString 方法
constructor
duck type
typeof 返回是字符串
适合 function和基本数据类型
typeof 10 number
typeof 'string' string
type of new Object() object
type of function function
typeof undifined undifined
typeof [1,2] object
typeof NaN number
typeof null object
对象类型检测使用
instanceof Object
判断对象是否是数组
左操作数:操作数是是一个对象 否则返回false
右操作数:是一个函数对象或者是函数构造器 typeerror 异常
delete 运算符 删除一个对象的一个属性,也可以设置属性的不能删除
demo: var obj={a:1}; alert(obj.a)//1 delete obj.a; alert(obj.a)//undefined
demo:
var obj={}; Object.defineProperty(obj,'x',{configurable:false,value:1}); configurable:true 属性可以删除,为false不可以删除 alert(obj.a)//1 delete obj.a;//false alert(obj.a)//1
删除不了原型链中的变量,不能用来删除变量
js没有块级作用域
for(var i=0; i<10; i++){
}
i并不是局部变量,在外部也可以访问i
var a=b=1;
虽然也可以实现a=1; b=1; 但是却是创建了一个全局作用变量b
function aa(){
var a=b=1;
}
console.log(typeof a);//undefined
console.log(typeof b)//number
在js中声明多个变量的方式:
var a=1,b=1;应该用逗号隔开
try
catch
finally
function
function aa(){}函数声明 会被预先处理,函数前置 在方法声明的前面调用方法是可以的 函数表达式不可以
var aa=function(){}函数表达式 函数表达式也可以带函数名,在函数递归调用中很有用
var aa=function cc(){}
for in遍历对象的属性
1 顺序不确定
2 enumberable为false时不会在for in中出现出现
3 for in 对象属性受原型链影响如果原型链中的enumberable为true也会在for in中出现
with 定义局部变量
但是在js中不建议实现
1 让js引擎优化更难
2 可读性差
3 可被变量定义替代
4 严格模式下被禁用
demo:
width(document.forms[0]){
console.log(name.value);
}
等价于
var form=document.forms[0];
console.log(form.name.value);
进入严格模式:
'use strict'
方法内部
function aa(){
'use strict'
}
js文件中
arguments变为参数的静态副本
!function(a){
arguments[0]=100
console.log(a);//100
}(1);
arguments代表所有的形参,可以改变
!function(a){
'use strict'
arguments[0]=100
console.log(a);//1
}(1);
在严格模式下,arguments代表所有的形参,但是不能改变参数的值
定义立即执行函数的方法
!function(a){ arguments[0]=100 console.log(a);//100 }(1);
(function(a){ console.log(a); })(1);
var aa=(function aa(a){console.log(a);}(10));