数据类型 类型检测

原始类型

基本类型: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));


原文地址:https://www.cnblogs.com/xiaofenguo/p/6772647.html