JavaScript语法和数据类型(全)

JS语法:
1、区分小写
2、标识符第一个字符是字母、下划线、美元符号$,其他可以是字符 下划线 美元字符 数字
,不能把关键字true null var用作变量名
3、单行注释// 多行/**/
4、变量
1)变量是弱类型,可以用来保存任何类型的数据,var v = "hi"; v=100;
2)var操作符定义的变量其在所在的作用域内是局部变量,省略是全局变量
5、数据类型
基本数据类型:Undefined Null Boolean Number String
复杂数据类型:Object
1)typeof操作符,不是函数,var v = 123;alert(typeof(v));或者alter(typeof v);
"undefined"  --未定义
”boolean“  --布尔值
”string“   --字符串
”number“   --数值
”object“   --对象或null
”function“ --函数
2)Undefined,只有一个值:undefined,在使用var声明的变量但未对其加以初始化时
,这个变量的值就是undefined。
var message;
alter(message==undefined);-->true
注:
包含undefined值的变量与尚未定义的变量还是不一样的。
var message;//这个变量声明之后的默认值是undefined
//var age  ;age这个变量并没有声明
alert(message); //undefined
alert(age); //产生错误
对于尚未声明的变量,只有一项操作,使用typeof操作符检测数据类型
var message;
alert(typeof message);-->undefined
alert(typeof age);    -->undefined
上面的结果表明,未初始化的变量和未声明的变量返回的类型都是undefined
,所以声明一个变量就应该初始化(哪怕是给一个空值咯,空字符串也行),这样就能用typeof检测出变量是未被初始化和未被声明的了。
3)Null,只有一个特殊值:null,null值表示一个空对象指针,typeof null返回object。
如果定义的变量用来保存对象,那么最好将该变量初始化为null而不是其他值
,只要检查null值就可以知道相应的变量是否已经保存了一个对象的引用
var car = null;
alert(typeof car);       -->object
alert(null == undefined);-->true
if(car==null){
//是对象了,再进行处理
}
undefined值是派生自null的,所以能相等,其实任何情况下都没必要声明一个变量的值为undefined,但可以声明对象为null,
所以这样能区分undefined和null。
4)Boolean类型,只有两个值true和false,True和False不是,只是标识符,可以通过Boolean(),将一个值转换为Boolean值。

-----------------------------------------------------------------------
       |数据类型 转换为true 转换为false
-----------------------------------------------------------------------
       |Boolean true false
-----------------------------------------------------------------------
       |String  非空字符串 空字符串
-----------------------------------------------------------------------
       |Number 非零 0和NaN
-----------------------------------------------------------------------
       |Object 任何对象 null
-----------------------------------------------------------------------
       |Undefined n/a(N/A) undefined
-----------------------------------------------------------------------
       | not applicable:不适用
-----------------------------------------------------------------------
if语句能自动转换
var message = "Hello World!"
if(message){
alert(message);
}

5)Number数据类型,使用IEEE754格式来表示整数和浮点数值
1)整数,十进制整数,八进制,十六进制
var intNum   = 55;
var octalNum = 070;//八进制,  十进制是56
var hexNum   = oxA;//十六进制,十进制是10

2)浮点数,小数点后必须有一位数字
var num1 = 1.1;
var num2 = 0.1;
var num3 =  .1;//不推荐使用
var num3 = 1. ;//自动解析为1,因为浮点数保存空间是整数两倍,ECMAScript会不失时机地将浮点数值转换为整数值。
var num3 = 1.0;//如果浮点数值本身表示的就是一个整数(1.0),那个该数值就会被转换为整数。
浮点数会产生舍入误差
3)NaN,非数值是一个特殊的数值,这个数值表示一个本来要返回数值的操作数未返回数值的情况。
var a = 1;
alert(1/0);-->NaN
NaN与任何值都不相等,包括NaN本身,可以用isNaN(),来判断参数是不是数值。
4)数据转换,非数值转化为数值:Number()、parseInt()和parseFloat()
Number():
true和false转化为1和0;null返回0;undefined返回NaN;"010"前导0会被忽略;" "空字符串会变为0。
parseInt():
"123blue"左侧开始最后一个非数字结束,结果为123;"070"转为56,这个与Number()前导0忽略不同;"0xf"转化为15。
指定基数:parseInt("70",8),按八进制解析;parseInt("f",16),按十六进制解析。
parseFloat():
忽略前导0,从左侧开始第一非数字或第二个小数点结束,"000123.123.123"转化为123.123
只能传递十进制参数,如果参数本身可解析为整数,那么就会返回整数。
6)String类型,由零或多个16位Unicode字符组成的字符序列,由双引号或单引号表示。
1)转义序列
\r:回车 \\:斜杠 \':单引号 \unnnn:十六进制nnnn表示一个unicode字符。
2)转化为字符串
toString(),可以输出2、8、16进制;null和undefined没有这个方法,为了防止在不知道值是null或undefined,使用String()。
使用String():有toString()就调用,null返回"null",undefined返回"undefined"。
var num=10;
var bl=true;
alert(num.toString(2));-->"1010"
alert(String(bl));     -->"true"
7)Object,一组数据和功能的集合
var o = new Object();
var b = new Object;//没有构造,可以这样写但不建议
属性和方法:
constructor:构造函数就是Object()
hasOwnProperty(propertyName):是否有这个属性
isPrototypeOf(object):是否是object的原型
toString():返回对象字符串表示
valueOf():返回对象字符串、数值、布尔值表示,与toString()返回相同
8)操作符
一元:
+,放在数值前面不会对数值有任何影响,包含非数值将调用Number(),将“值”转化为数值。
-,与+不同变成负数。
var b = false; b= +b; alert(b);-->0
布尔操作符:
1)!:非,将非布值Boolean()函数转换为布尔值。
2)&&:与,不能使用未定义的值,短路操作,第一个false,第二个不计算。
不一定返回布尔值,有一个操作数不是布尔值时,
第一个对象,返回第二个;
第一个true,第二个是对象返回第二个;
有一个null,返回null;
有一个NaN,返回NaN;
有一个undefined返回undefined。
var found = true;  alert(found && someUndefinedVariable);-->报错,someUndefinedVariable未定义。
3)||:或
不一定返回布尔值,有一个操作数不是布尔值时,
第一个对象,返回第一个;
第一个false,返回第二个;
两个null,返回null;
两个NaN,返回NaN;
两个undefined返回undefined。
var found = false;  alert(found && someUndefinedVariable);-->报错,someUndefinedVariable未定义。
!!!//备用模式
var myObject = object||backupObject;//当object为null时,返回备用值。
总结:如果有一个操作数不是布尔值,先将操作数Boolean()转化后,返回操作数真实值(布尔、本身的类型)。
关系操作符:
> >= < <=
两个操作数都是数值,数值比较
两个操作数都是字符串,比较字符编码值(大写字母大于小写字母,toLowerCase()都将他小写字母后比较)
如果一个操作数是数值,另一个转换为数值,然后执行数值比较
如果一个操作数是对象,调用valueOf()方法,根据前面的规则比较
如果一个操作数是布尔值,则将其转换为数值,然后进行比较
alert("23"<"3");-->true ,2(50)的编码小于3(51)
alert("23"<3);  -->false ,有一个数值,另一个转换为数值后再比较
alert("a"<3);   -->false,a被转化为了NaN,任何操作数与NaN比较都是返回false
== !=
有一个不是不是数值,转化为数值后比较
两个都是对象,比较是不是同一个对象
任何与NaN比较返回false
true: NaN!=NaN null=undefined false==0 true==1
false:NaN==NaN null==0 
===全等   !===不全等,推荐使用,避免了类型转化,保持数据类型完整性
不转化操作数,比较是否相等
#########################################################################
for语句
ECMAScript中不存在块级作用域,循环内部定义的变量,外面也可以访问到
for(var i=1;i<10;i++){
   alert(i);
}
alert(i);
for-in语句
迭代返回枚举对象的属性
for(var propName in window){
document.write(propName);
document.write("<br/>");
}
label语句,配合break、continue
start:for(var i=0;i<10;i++){
if(i===2){
break start;
}
}
switch,expression和value可以是任何类型的,用全等操作符类比较expression与value是否相等
switch(expression){
case value: statement
break;
default:    statement
    break;
}
函数:
function(arg0,arg1....){
statements
}
1)参数
不管开始定义了多少个,调用的时候,传值可以不用考虑个数和数据类型,因为参数在
内部是用一个数组来表示的,函数体内通过arguments加下标来访问。
当定义了多个参数,调用的时候但有部分没传进来,则会赋值为undefined。
2)没有重载,两个名称一样的函数,后者生效。

##########################################################
1、动态属性,对于引用类型,可以为其添加属性和方法;不能给基本类型添加属性,尽管不会报错。
var person = new Object();
person.name="Nicholas";
alert(person.name); -->Nicholas

2、复制变量值
var num=5;
var num2=num;
基本类型的复制,再对其中一个进行任何操作对其中一个不会有影响。
引用类型是指针的复制,指向同一个对象,改变其中一个就会影响到另一个。
3、函数参数传递
基本类型是值
引用类型是指针

4、检测类型:number boolean undefined object function array regexp
typeof:检测数据类型
instanceof:是否是指定的类型
var person=new Object();
alert(person instanceof Object);-->true

#########################################################
1、环境,每个环境都有一个与之关联的变量对象,环境中的变量和函数都保存在这个对象中。
       每个函数在被调用的时候都会创建自己的执行环境。
2、作用域,内部访问外部,上下级关系,查找从内向外开始,
       内部没有将在外部找,找不到就意味着该变量未声明。
3、没有块级作用域,if for with try-catch...
var声明的变量自动添加到距离它最近的环境中。没有var声明的变量,将是全局变量!
if(true){
var color="blue";
}
for(var i=0;i<5;i++){}
with(location){
var url=href;//href是location的属性,location.href
}
alert(color);-->blue
alret(i);-->5
alert(url);-->当前窗体的href
function add(num1,num2){
sum=num1+num2;
return sum;
}
var result=add(10,20);
alert(sum);-->sum是全局变量了,结果30

4、垃圾回收
1)标志清除:进入环境和离开环境时标记,垃圾回收器运行时,会给存储在内存中的所有变量加上标记,
  然后去掉环境中的表里和被环境中的变量引用的变量,删除仍然带有标记的变量。
2)引用计数:跟踪每个值被引用的次数,回收次数为0的,但解决不了循环引用。
var obj1=new Object();
var obj2=new Object();
obj1.name=obj2;
obj2.age=obj1;
无法回收,使用之后解除引用才能回收(解除引用能“释放”内存)
obj1.name=null;
obj2.age=null;
3)性能问题:IE window.CollectGarbage() 立即执行垃圾回收。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值