javascript高级程序设计

第一章

1.注意标签中的

function sayScript(){
    alert('<\/script>');//  如果這樣寫會報錯“alert('</script>')”
}

第三章

3.12 标识符

所谓标识符,就是指变量、函数、属性的名字,或者函数的参数。标识符可以是按照下列格式规则组合起来的一个或多个字符:

(1)每一个字符必须是字母、下划线(_)或者一个美元符号($);
(2)其他字符可以是字母、下划线、美元符号或数字。
标识符中的字母也可以包含扩展的ASCII或Unicode字母字符(如さ和し),但我们不推荐这样做。
ECMAScript标识符采用驼峰大小写格式,也就是第一个字母小写,剩下的每个有意义的单词的首字母大写,

    eg:
    firsetSecond、myCar、doSomethingImportant
3.4 数据类型
基本数据类型:UndefinedNull、Boolean、NumberString
3.4.3 null 类型
alert(null == undefined); //true
3.4.4Boolean类型
数据类型转换为true的值转换为false的值
Booleantruefalse
String任何非空字符串“”(空字符串)
Number任何非零数字值(包括无穷大)0和NaN
Object任何对象null
Undefinedn/aUndefined
3.45 Number类型

1.浮点数数值

var floatNum = 3.125e7//等于31250000
var floatNum = 3e-7//等于0.0000003

浮点数的计算要注意:0.1+0.2的结果不是0.3
所以不要做这样的测试
if(a + b == 0.3){
    alert(You got 0.3);
}

2.数值范围
最小值:Number.MIN_VALUE(在大多数浏览器中,这个值是5e-324)
最大值:Number.MAX_VALUE(在大多数浏览器中,这个值是1.7976931348623157e+308)
如果某次计算的结果超过这个最大值,或者低于这个最小值,那么这个值是正数,则会转正Infinity(正无穷),如果这个值是负数,则会转正-Infinity(负无穷)
如果想确定这个值是不是有穷的,则可以使用isFinite()函数。这个函数在参数位于最小与最大值之前时会返回true,如下面的例子:

    var result = Number.MAX_VALUE+ Number.MAX_VALUE;
    alert(isFinite(result)); //false

特殊:访问Number.NEGATIVE_INFINITY和Number.POSITIVE_INFINITY也可以得到负和正的Infinity的值。可以想见,这两个属性中分别保存着-Infinity和Infinity。

4.数值转换
有3个函数可以把非数值转换为数值:Number()、parseInt()、parseFloat()。
Number()函数的转换规则如下。
∏如果是Boolean值,true和false将分别被转换为1和0。
∏如果是数字值,只是简单的传入和返回。
∏如果是null值,返回0。
∏如果是undefined,返回NaN。
∏如果是字符串,遵循下列规则:
∏如果是字符串,遵循下列规则:
▆如果字符串中数字(包括前面带正号或负号的情况),则将其转换为十进制数值,即“1”会变成1,“123”会变成123,而“011”会变成11(注意:前导的零被忽略了);
▆如果字符串中包含有效的浮点格式,如“1.1”,则将其转换为对应的浮点数值(同样,也会忽略前导零);
▆如果字符串中包含有效的十六进制格式,例如“0xf”,则将其转换为相同大小的十进制整数值;
▆如果字符串是空的(不包含任何字符),则将其转换为0;
▆如果字符串中包含除上述格式之外的字符,则将其转换为NaN。
∏如果是对象,则调用对象的valueOf()方法,然后依照前面的规则转换返回的值。如果转换的结果是NaN,则调用对象的toString()方法,然后再次依照前面的规则转换返回的字符串值。

    eg:
        var num1 = Number("Hello world!"); //NaN
        var num2 = Number("");             //0
        var num3 = Number("000011");       //11
        var num4 = Number(true);           //1

parseInt():在转换字符串时,更多的是看其是否符合数值模式。它会忽略字符串前面的空格,直至找到一个非空格字符。如果第一个字符不是数字字符或者负号,parseInt()会返回NaN;也就是说,parseInt()转换空字符串会返回NaN,而用Number()对空字符串返回0.如果第一个字符是数字字符,parseInt()会继续解析第二个字符,直到解析完所有的字符或者遇到了一个非数字字符。例如,”1234blue”会被转换为1234,因为“blue”会被完全忽略,类似的,“22.5”会被转换为22,因为小数点并不是有效的数字字符。
如果字符串中的第一个字符是数字字符,parseInt()也能识别各种整数格式(即十进制、八进制和十六进制数)。也就是说,如果字符串以“0x”开头且后面跟数字字符,就会将其作一个十六进制数;如果字符串以“0”开头且后面跟数字字符,则会将其当作一个八进制数来解析。

    eg:
        var num1 = parseInt("1234blue");       //1234
        var num2 = parseInt("");               //NaN
        var num3 = parseInt("0xA");            //10(十六进制数)
        var num4 = parseInt(22.5);             //22
        var num5 = parseInt("070");            //56(八进制数)最好不要用这个,因为在ECMAScript3中认为是56(八进制),而在ECMAScript5中认为是0(十进制)
        var num7 = parseInt("0xf");            //15(十六进制数)

为了消除在使用parseInt()函数时可能导致的上述困惑,可以为这个函数提供第二个参数:转换时使用的基数(即多少进制)。如果知道要解析的值是十六进制格式的字符串,那么指定基数16作为第二个参数,可以保证得到正确的结果,

    eg:
        var num = parseInt("0xAF", 16);   //175
        实际上,如果指定了16作为第二个参数,字符串可以不加前面的“0x”,如下例子:
        var num1 = parseInt("AF", 16);    //175
        var num2 = parseInt("AF");        //NaN
    指定基数会影响到转换的输出结果。
    eg:
        var num1 = parseInt("10", 2);          //2(按二进制解析)
        var num2 = parseInt("10", 8);          //8(按八进制解析)
        var num3 = parseInt("10", 10);         //10(按十进制解析)
        var num4 = parseInt("10", 16);         //16(按十六进制解析)
parseFloat()与parseInt()函数类似,parseFloat()也是从第一个字符(位置为0)开始解析每个字符。而且也是一走解析到字符串尾,或者解析到遇到一个无效的浮点数数字字符为止。也就是说,字符串中的第一个小数点是有效的,而第二个小数点就是无效的了,因此它后面的字符串将被忽略。举例来说,“22.34.5”将会转换为22.34。
除了第一个小数点有效外,parseFloat()与parseInt()的第二个区别在于它始终都会忽略前导零。parseFloat()可以识别前面讨论过的所有浮点数格式,也包括十进制整数格式。但十六进制格式的字符串则始终会转换成0。由于parseFloat()只解析十进制值,因为它没有用到第二个参数指定基数的用法。最后一点要注意:如果字符串包含的是一个可解析为整数的数(没有小数点,或者小数点后都是零),parseFloat()会返回整数。以下是使用parseFloat()转换数值的几个典型示例。
    eg:
        var num1 = parseFloat("1234blue");      //1234(整数)
        var num2 = parseFloat("0xA");           //0
        var num3 = parseFloat("22.5");          //22.5
        var num4 = parseFloat("22.34.5");       //22.34
        var num5 = parseFloat("0908.5");        //908.5
        var num6 = parseFloat("3.125e7");       //31250000

3.46 String类型
String类型用于由零或多个16位Unicode字符组成的字符序列,即字符串。

字面量含义
\n换行
\t制表
\b空格
\r回车
\|斜杠
\’单引号(‘),在用单引号表示的字符串中使用。例如:\’hey.\’
\”双引号(“),在用双引号表示的字符串中使用。例如:He said,\”hey.\”
\xnn以十六进制代码nn表示的一个字符(其中n为0~F)。例如,\x41表示“A”
\unnn以十六进制代码nnnn表示的一个Unicode字符(其中n为0~F)。例如,\u03a3表示希腊字符Σ

3.转换为字符串

 eg:
    var age = 11;
    var ageAsString = age.toString();              //字符串“11”
    var found = true;     
    var foundAsString = found.toString();          //字符串“true”
数值、布尔值、对象和字符串值都有toString()方法,但是null和undefined值没有这个方法。
    eg:
        var num = 10;
        alert(num.toString());               //“10”
        alert(num.toString(2));              //“1010”
        alert(num.toString(8));              //“12”
        alert(num.toString(10));             //“10”
        alert(num.toString(16));             //“a”
在不知道要转换的值是不是null或undefined的情况下,还可以使用转型函数String(),这个函数能将任何类型的值转换为字符串。String()函数遵循下列转换原则:
∏如果值有toString()方法,则调用该方法(没有参数)并返回相应的结果;
∏如果值是null,则返回“null”;
∏如果值是undefined,则返回“undefined”
    eg:
        var value1 = 10;
        var value2 = true;
        var value3 = null;
        var value4;

        alert(String(value1));       //“10”
        alert(String(value2));       //“true”
        alert(String(value3));       //“null”
        alert(String(value4));       //“undefined”
3.5.1一元操作符
    eg:
        var num1 = 2;
        var num2 = 20;
        var num3 = num1-- + num2;    //等于22
        var num4 = num1 + num2;      //等于21
    eg:
        var s1 = "2";
        var s2 = "z";
        var b = false;
        var f = 1.1;
        var o = {
            valueOf:function(){
                return -1;
            }
        };

        s1++;                    //值变成数值3
        s2++;                    //值变成NaN
        b++;                     //值变成数值1
        f--;                     //值变成0.10000000000000009(由于浮点传入错误所致)
        o--;                     //值变成数值-2

for对应while

for(;;){//无限循环
    doSomething();
}

//只给出控制表达式实际上就把for循环转换成了while循环
var count = 10;
var i = 0;
for(; i<count; ){
    alert(i);
    i++;
}
正则表达式
var mathces = pattern2.exec(text);
console.log("matches.index:" + matches.index);
console.log("matches[0]:" + matches[0]);
console.log("patter2.lastIndex:" + pattern2.lastIndex);
var person = {};
Object.defineProperty(person, "name", {
    writable: false,
    value: "Nicholas"
});

alert("person.name:" + person.name);
person.name = "Greg";
alert(person.name);
//输出结果为:
//"Nicholas"
//"Nicholas"

判断函数对象是否处于原型中

function Person(){
}

Person.prototype.name = "Nicholas";
Person.prototype.age = 29;
Person.prototype.job = "Software Engineer";
Person.prototype.sayName = function(){
    alert(this.name);
}

var person1 = new Person();
var person2 = new Person();

person1.name = "Greg";
alert(hasPrototypeProperty(person1, "name"));//false
alert(hasPrototypeProperty(person2, "name"));//true

function hasPrototypeProperty(object, name){
    return !object.hasOwnProperty(name) && (name in object);
}

不使用for in遍历函数对象

function Person(){
}

Person.prototype.name = "Nicholas";
Person.prototype.age = 29;
Person.prototype.job = "Software Engineer";
Person.prototype.sayName = function(){
    alert(this.name);
}

var keys = Object.keys(Person.prototype);
alert("keys:" + keys);//"keys:name,age,job,sayName"

var p1 = new Person();
p1.name = "Rob";
p1.age = 31;
var p1keys = Object.keys(p1);
alert(p1keys);//"name,age"
var book = {
    _year: 2004,
    edition: 1
};

Object.defineProperty(book, "year", {
    get: function(){
        return this._year;
    },
    set: function(newValue){
        if(newValue > 2004){
            this._year = newValue;
            this.edition += newValue - 2004;
        }
    }
});

book.year = 2005;
alert(book.edition);
//输出结果 2

===============================================================

var book = {};

Object.defineProperties(book, {
    _year: {
        value: 2004
    },

    edition: {
        value: 1
    },

    year: {
        get: function(){
            return this._year;
        },
        set: function(newValue){
            if(newValue > 2004){
                this._year = newValue;
                this.edition += newValue - 2004;
            }
        }
    }
});

var descriptor = Object.getOwnPropertyDescriptor(book, "_year");
alert(descriptor.value);//2004
alert(descriptor.configurable);//false
alert(typeof descriptor.get);//"undefined"
alert(descriptor.value);//2004
alert(descriptor.enumerable);//false
alert(typeof descriptor.get);"undefined"

==============================================================

function createPerson(name, age, job){
    var o = new Object();
        o.name = name;
        o.age = age;
        o.job = job;
        return o;
}

var person1 = createPerson("Nicholas", 29, "Software Engineer");
var person2 = createPerson("Greg", 27, "Doctor");
console.log("person1:" + JSON.stringify(person1));//person1:{"name":"Nicholas","age":29,"job":"Software Engineer"}
console.log("person2:" + JSON.stringify(person2));//person2:{"name":"Greg","age":27,"job":"Doctor"}

==============================================================

function Person(name, age, job){
    this.name = name;
    this.age = age;
    this.job = job;
    this.sayName = function(){
        alert(this.name);
    }
}
var person1 = new Person("Nicholas", 29, "Software Engineer");
var person2 = new Person("Greg", 27, "Doctor");
alert(person1.constructor == Person);//true
alert(person2.constructor == Person);//true

==============================================================

function Person(name, age, job){
    this.name = name;
    this.age = age;
    this.job = job;
    this.sayName = function(){
        alert(this.name);
    }
}
var person1 = new Person("Nicholas", 29, "Software Engineer");
var person2 = new Person("Greg", 27, "Doctor");
alert(person1 instanceof Object);//true
alert(person1 instanceof Person);//true
alert(person2 instanceof Object);//true
alert(person2 instanceof Person);//true

==============================================================

function Person(name, age, job){
    this.name = name;
    this.age = age;
    this.job = job;
    this.sayName = function(){
        alert(this.name);
    }
}
var person = new Person("Nicholas", 29, "Software Engineer");
    person.sayName();//Nicholas

Person("Greg", 27, "Doctor");
window.sayName();//Greg

var o = new Object();
    Person.call(o, "Kristen", 25, "Nurse");
    o.sayName();//Kristen

==============================================================

function Person(name, age, job){
    this.name = name;
    this.age = age;
    this.job = job;
    this.sayName = function(){
        alert(this.name);
    }
}
var person1 = new Person("Nicholas", 29, "Software Engineer");
var person2 = new Person("Greg", 27, "Doctor");
alert(person1 == person2);//false
==============================================================
function Person(name, age, job){
    this.name = name;
    this.age = age;
    this.job = job;
    this.sayName = new Function(alert(this.name));
}

function sayName(){
    alert(this.name);
}
var person1 = new Person("Nicholas", 29, "Software Engineer");
var person2 = new Person("Greg", 27, "Doctor");
alert(person1.sayName == person2.sayName);//true
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值