javascript高级程序设计学习笔记(第三章)--数据类型、操作符、语句、函数

-ECMAScript语法

1. 标识符:变量、函数、属性的名字,一般用驼峰格式。字母、_或$开头,不能是关键字或者保留字。
2. 关键字:执行特定操作或者作为控制语句开头。如if、function。
3. 保留字:有可能作为关键字。
4. 变量:可以保存任何类型数据的一个占位符,用var 定义。但var定义的变量是作用域中的局部变量,在定义变量的函数退出后就会销毁。(严格模式下初始化未声明的变量会报错)

test = function() {
    var message = "hahaha";
}
test();
alert(message);//浏览器报错为undefined

当省略var时变量为全局变量,就可以被访问到

test = function() {
    message = "hahaha";
}
test();
alert(message);//弹出窗口"hahaha"


-数据类型

5种普通string、number、boolean、null、undefined,一种复杂object。用操作数 typeof 来检测数据类型,因为是操作数可以不加括号。

var message;
var age = 10;
var num = 1>2;
var name = "haha";
test = function() {};
alert(typeof message); //undefined
alert(typeof age); //number
alert(typeof num); //bollean
alert(typeof name); //string
alert(typeof null); //**object** 
alert(typeof test); //function

1.undefined

var message = "hahaha";
var name;
alert(message); //输出"hahaha"
alert(name); //未初始化变量输出undefined
alert(age); //未定义变量浏览器抛出错误undefined
alert(typeof age); //输出undefined

未定义变量与未初始化变量执行typeof操作符时都返回undefined,为了区分最好给每个变量都定义。

2.null
当变量为对象时,在没有确定对象的值之前,先初始化为null,当对象值确定后就可以直接操作 if(car != null) {…}
undefined是null派生的,所以相等

alert(null == undefined); //true

3.boolean
两个面值:true和false,true不一定为1,false不一定为0。其他数据类型可以转换为布尔型,用 Boolean() 函数。
转换为true:true,任何对象,任何非零数值(包括无穷大),任何非空字符串;
转换为false:false、null、undefined、0或NaN、空字符串;

if(Number.MAX_VALUE){
        alert("Value is true"); //Vlaue is true
    }

4.number

var num = 080; //十进制
var num1 = 010; //0开头且数字都不大于7,八进制
var num2 = -0x10; //十六进制
var num3 = 0.10; 
alert(num); //80
alert(num1); //8
alert(num2); //-16
alert(num3); //0.1

多余的0会被忽略,可以用科学计数法,其中e和后面的数字构成10的指数次幂。

var num4 = 1.23e6;
alert(num4);//1230000
var num5 = 1.23e-6
alert(num5); //0.00000123

ECMAScript可以保存的数值范围:Number.MIN_VALUE ~ Number.MAX _VALUE。
超出时为无穷 Infinity(Number.POSITIVE_INFINITY) 和 -Infinity(Number.NEGATIVE_INFINITY),用函数 isFinite() 判断是否在范围之内。

var num6 = 2*Number.MAX_VALUE;
alert(isFinite(num6)); //false
var num7 = Number.NEGATIVE_INFINITY;
alert(num7); //-Infinity

NaN(Not a Number),用来表示原本应返回数值的操作数未返回数值的情况。两个特点:任何涉及NaN的操作都返回NaN且NaN不等于任何数值包括它本身。isNaN()函数确定一个参数是否“不是数值”。

alert(NaN == NaN); //false
alert(isNaN(NaN)); //true
alert(isNaN(20)); //false
alert(isNaN("10")); //false,字符串可转换为数值
alert(isNaN(false)); //false,布尔值可转换为数值
alert(isNaN("pink")); //true,不可转换为数值

数值转换:将非数值转换为数值有3种方法Number(),parseInt(),parseFloat()。

var num1 = Number(true); //1
var num2 = Number(""); //0
var num3 = Number("006.0"); //6
var num4 = Number(null); //0
var num5 = Number("black"); //NaN
var num6 = Number(0x10); //16,全部转换为十进制

parseInt():将数值转换为整数,从第一个字符开始解析直到字符串末尾,遇到小数点和非数值字符则停止。当跳过空格后的第一个字符不为数值,返回NaN。可以指定转换进制数,parseInt(数值,进制数),将数值看成该进制数转换为十进制数。

var num1 = parseInt("h123"); //NaN
var num2 = parseInt(true); //NaN
var num3 = parseInt("123h"); //123
var num4 = parseInt("10",8); //8,八进制数“10”转换为十进制数8

parseFloat():从第一个字符开始解析直到字符串末尾,遇到无效的浮点数字符则停止。当跳过空格后的第一个字符不为数值,返回NaN。只解析十进制。

var num1 = parseFloat("0x10"); //0
var num2 = parseFloat(true); //NaN
var num4 = parseFloat("0.120"); //0.12
var num5 = parseFloat("0.2blue"); //0.2

5.string
所有字符串都可以用length属性获取长度,ECMAScript中字符串不可变,只能销毁原来的再用一个新的字符串填充变量。

var lang = "java";
lang = lang + "script"; //创建一个填充"javascript"的字符串,再销毁"java""script"
alert(lang.length); //10

将其他数据类型转换为string用 toString()String() 方法。由于 null 和 undefined 值没有toString()方法,所以使用String() 方法转换,其他类型两者都可以。不确定是哪种类型用String()。toString()中可加参数,转换为几进制数。

var message = null;
var num = 10;
alert(num.toString(8)); //"12"
alert(String(message)); //null

6.object
ECMAScript中的对象是一组数据和功能的集合,用new操作符加要创建的对象类型的名称来创建。其中object类型是该语言中所有对象的基础类型。创建Object类型的实例并为其添加属性和方法。

var o = new Object();
alert(typeof o); //object

Object实例的属性和方法:

  • Constructor:保存创建当前对象的函数,上例中为Object();
  • hasOwnProperty(propertyName):检查给定属性在当前对象实例中是否存在,propertyName必须为字符串形式,例如o.hasOwnProperty(“name”);
  • isPrototypeOf(object):当前传入对象是否为另一对象的原型;
  • propertyIsEnumerable(propertyName):检查给定属性是否能用for-in语句枚举,propertyName必须为字符串形式(enumerable [ɪˈnjuːm(ə)rəb(ə)l] 可数的);
  • toLocaleString():返回对象的字符串表示,与执行环境的地区对应;
  • toString():返回对象的字符串表示;
  • valueOf():返回对象的字符串,数值,布尔值表示,通常与toString()返回值相同。

-操作符

操作数据值的操作符,包括算数操作符,关系操作符,位操作符和相等操作符。适用于布尔值、字符串、数字值、对象。

1.一元操作符:只能对一个值进行操作。
递增和递减操作符(++,- -):将操作的变量转换为数值变量,再进行加减。如果变量是对象,用valueOf()获取可供操作的值(结果为NaN时用toString()方法)后再进行加减。

var m = "haha";
var t = true;
var f = 0.20;
var o = {
    valueOf: function() {
        return -2;
    }
}
t++;
alert(m++); //NaN
alert(t); //2
alert(--f); //-0.8
alert(o--); //-2
alert(o--); //-3

一元加和减操作符(+,-):对数值不会有影响,只是将非Number型转化为Number型,减操作符加上负号。

alert(+t); //2
alert(-o); //4

2.位操作符
求一个负数的二进制码:求绝对值的二进制码,求反码再加一,得到负数的二进制码。ECMAScript会隐藏这些过程,向我们展示负号加这个数绝对值的二进制码。

var num = -8;
alert(num.toString(2)); //-1000

-按位非(NOT):由“~”表示,结果为返回数值的反码,即操作数的负值减1

var num = 6;
alert(~num); //-7

-按位与(AND):“&”
-按位或(OR):“|”
-按位异或(XOR):“^”,相等为0,相反为1
-左移:“<<”,不会影响符号位
-有符号的右移:“>>”,不会影响符号位
-无符号的右移:“>>>”,正数不影响,负数增大

var result1 = 8 & 9;
var result2 = 8 | 9;
var result3 = 8 ^ 9;
var result4 = 8 << 1;
var result5 = 8 >> 2;
var result6 = -8 >>> 1;
alert(result1); //72
alert(result2); //9
alert(result3); //1
alert(result4); //16
alert(result5); //2
alert(result6); //2147483644

3.布尔操作符
-逻辑非:“!”,将操作数转换为布尔值再求反;“!!”,相当于Boolean()方法,求操作数的布尔值;
-逻辑与:“&&”,短路操作符,当第一个操作数决定了结果(false),就不对第二个操作数求值。当其中一个操作数为null、NaN、undefined返回他们本身。

alert(!NaN); //true
alert(!!""); //false
var t = false; //为true时报错undefinedVar未定义
var result = (t && undefinedVar);
alert(result); //false

-逻辑或:“||”,短路操作符,当第一个操作数决定了结果(true),就不对第二个操作数求值。当两个操作数都为null、NaN、undefined返回他们本身。

var t = true; //false则报错undefinedVar未定义
var result = (t || undefinedVar);
alert(result); //true

用来给变量赋值,避免出现null或undefined

var myObject = a || b; //默认将a的值赋给变量,当a不包含有效值,则将b赋给变量。

4.乘性操作符
乘法(*)、除法(/)、求模(%,余数)。当操作数是非数值时,后台用Number()方法将其转换为数值再操作。

var result1 = 0 * Infinity; //NaN
var result2 = -2 * Infinity; //-Infinity
var result3 = Infinity * -Infinity; //-Infinity

var result4 = 0 / 0; //NaN
var result5 = -7 / 0; //-Infinity
var result6 = Infinity / Infinity; //NaN
var result7 = Infinity / 8; //Infinity

var result8 = Infinity % -8; //NaN
var result9 = Infinity % Infinity; //NaN
var result10 = 2 % 0; //NaN
var result11 = 10 % Infinity; //10
var result12 = 0 % 10; //0

5.加性操作符
加法(+):当一个字符串与非字符串的数相加,将非字符串用 toString() 或 String()(操作数为null或undefined) 转换为字符串后相连。

var num = -Infinity + Infinity; //NaN
var s1 = 2;
var s2 = 3;
alert("2+3="+s1+s2); //2+3=23
alert("2+3="+(s1+s2)); //2+3=5

减法(-):将非数值通过 Number() 转换为数值后操作,如果是对象,则用 valueOf() 或 toString() 转换为可操作的数值或字符串。

var num = Infinity - Infinity; //NaN
var num1 = NaN - 1; //NaN
var num2 = "" - 2; //-2

6.关系操作符
(>,<,>=,<=)返回布尔值。两字符串根据字符编码值比较;当其中一个操作数为数值则另一个操作数也转换为数值;其中一个操作数为对象用 valueOf() 或 toString(),再比较;布尔值转换为数值比较。

var result = "Black" < "apple"; //true,大写字母的字符编码值小于小写字母
var result1 = "Black".toLowerCase() < "apple".toLowerCase(); //false,按字母表排序
var num = 3 > NaN; //false
var num1 = 3 <= NaN; //false ,NaN的任何操作都返回NaN

7.相等操作符
相等(==)不相等(!=):先转换再比较。一个操作数为字符串或布尔值先转换为数值再比较;一个操作数为对象用valueOf() 再转换为数值;两个操作数都是对象看它们是否指向同一个对象;null和undefined比较前不能转换为其他类型。

alert(NaN != NaN); //true
alert(null == undefined); //true
alert(true == "1"); //true

全等(===)不全等(!==):仅比较不转换。值相同且类型相同才全等

alert(null === undefined); //false
alert("55" != 55); //false
alert("55" !== 55); //true

8.条件操作符
variable = boolean_expression ? true_value : false_value;

9.赋值操作符
复合赋值(+=,-=,>=,<=,<<=,>>=,*=,/=,%=);

10.逗号操作符

var num = 1, num1 = 2, num2 = (1,2,3,4); //声明多个变量
alert(num2); //4,返回表达式中最后一项
-语句

用一个或多个关键字完成给定任务。如通知函数退出,指定重复执行命令的次数。

var i = 0;
do{
    i += 2;
}while(i<0); //i=2  

while(i<0) {
    i += 2; //i=0
}
var count = 10;
var i; //循环中的变量可在外部声明
for(i=0 ; i<count ; i++) {
    alert(i);
}

for(var i=0 ; i<count ; i++) {
    alert(i);
}
alert(i); //10,循环中声明的变量可以在外部访问

for语句中的三个表达式都是可选的,当都省略就是一个无限循环,只有控制表达式时是一个while循环。

for(;;){
    alert("haha"); //不断弹出“haha”
}

var count = 10;
var i = 0;
for(; i<count ;) {
    alert(i); //弹出0~9
    i++;
}

for-in:精准的迭代语句,枚举对象的属性,声明变量可在循坏外部。

for(var propName in window) {
    document.write(propName);
}

label语句:在代码中添加标签,语法 label:statement;可用break或continue引用;一般与for等循环语句配合。

start: for(var i=0 ; i<2; i++) {
    alert(i);
}

continue退出后从循环顶部继续执行;break立即退出循环

var num = 0, i, j;
outermost:
for(i=0 ; i<7; i++) {
    for(j=0; j<8; j++) {
        if(i==5 && j==6) {
            break outermost;
            //continue outermost; 输出7*8-(8-6)=54
        }
        num++;
    }
}
alert(num); //5*8+6=46

with语句:把代码的作用域设置到同一对象上。with (expression) statement; 在严格模式下不允许使用,开发中不建议使用。

var qs = location.search.substring(1);
var url = location.href;
//相当于:
with(location) {
    var qs = serch.substring(1);
    var url = href; 
}

switch:判断switch中的值与哪一个case中的值全等(仅比较不转换);每一个case表达式中都加break,如果需要合并几个case,需要注释说明。switch中可以使用任意数据类型,case的值也可以是表达式或者变量

var num = 1;
switch (true) {
    case num < 0:
        alert("num < 0");
        break;
    case num > 0 && num < 2:
        //合并两种情况
    case num == 0 && num == 2:
        alert("0 <= num <= 2 "); //输出 0 <= num <= 2
        break;
    default:
        alert("num > 2")
    }
}
-函数

由关键字function声明,function functionName (arg0,arg1,…,argN) {statements},在任何时候都可以用return实现返回值,return后直接退出函数,return后的语句永远不会被执行。若return;返回undefined,用于提前结束函数不返回值的情况。

function diff(num1,num2) {
    if(num1 > num2) {
        return num1 - num2;
    }else{
        return num2 - num1;
    }
    alert(num1); //永远不会执行
}
var result = diff(2,6); //调用函数
alert(result); //输出4

严格模式下,不能将参数或函数命名为eval或arguments,函数中不能有两个同名参数。
函数的参数可以是任意个任意类型,都保存在arguments对象中,类似一个参数数组,通过方括号语法访问每一个参数,length属性确定数组长度。

function functionName(num1,num2) {
    if(arguments.length == 1) {
        alert(arguments[0]);
    }else if(arguments.length == 2) {
        alert(num1 + arguments[1]);
    }else{
        alert(arguments.length);
    }
}
functionName(true); //true
functionName(666,",haha"); //666,haha
functionName(1,2,3); //3

没有传入参数的值自动赋为undefined,(在非严格模式下设置arguments[ ]的值会相应改变命名参数的值,改变命名参数的值不会改变arguments[ ];而严格模式下改变argument的值会报错。???)
不能实现重载(为同一函数编写两个定义,只要两个定义的签名即传入参数的类型和数量不同即可)。ECMAScript中只能是后面的函数覆盖前面的函数。

function addOne(num) {
    alert(num + 100);
}
function addOne(num) {
    alert(num + 200);
}
addOne(100); //300
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值