[关闭]
@Secretmm 2016-10-17T05:58:27.000000Z 字数 3823 阅读 889

js犀牛书学习记录

js/jquery web前端


类型、值、变量


数字

文本

转义字符

<script type="text/javascript">
// 用转义字符‘\’避免使用常规方式来解释单引号
var str='you\'re right,it can\'t be quote'
var s="you're right,it can't be quote"
//两种的结果是一样的
console.log(str);
console.log(s);
</script>

结果:

you're right,it can't be quote
you're right,it can't be quote

字符串

var msg='hello'+''+'world';
var msg='hello'+'world';

结果都是:helloworld


var sg= "Hello world"
console.log(sg.charAt(0));//第一个字符
console.log(sg.charAt(sg.length-1));//最后一个字符
console.log(sg.substring(1,4));//下标从1到3的字符
console.log(sg.slice(1,4));//下标从1到3的字符
console.log(sg.indexOf('l'));//字符l首次出现的位置的下标
console.log(sg.lastIndexOf("1"));//字符l最后出现的位置的下标
console.log(sg.indexOf("1",3));//字符l在下标3及之后首次出现的位置的下标
console.log(sg.split(" "));//以空格分割成子串
console.log(sg.replace("H","M"));//全文字符替换
console.log(sg.toUpperCase());//全部转为大写字母

结果是:

 H
 d
 ell
 ell
 2
 -1
 -1
 ["Hello", "world"]
 Mello world
 HELLO WORLD

模式匹配---正则表达式

代码:

var txt= "testing: 1,2,3"; //定义一个字符串 
var pattern= /\d+/g  //匹配所有包含一个或多个数字的实例
console.log(pattern.test(txt));//匹配是否成功,成功为true,匹配失败false4
console.log(txt.search(pattern));//首次匹配成功的位置或下标
console.log(txt.match(pattern));//所有匹配组成的数组
console.log(txt.replace(pattern,"*"));//每个匹配都换成*
console.log(txt.split(/\D+/));//这个宝宝暂时还不懂

结果如下:

 true
 9
 ["1", "2", "3"]
 testing: *,*,*
 ["", "1", "2", "3"]

布尔值

布尔值指代真或假、开或关、是或否。这个类型的值只有两个值,保留字true和false。

js中比较语句的结果通常都是布尔值,例如:

console.log(a==4);

这句代码用来检测变量a的值是否等于4,如果等于4,则返回true,如果不等,则为false


null和undefined

null:关键字;特殊值,描述“空值”;特殊的对象值,含义是“非对象”;表示数字、字符串和对象是‘无值’的

undefined:不是关键字;“未定义”


全局对象


包装对象

1.对象是一种复合值,它是属性或已命名值的集合。通过“.”符号来引用属性值。当属性值是一个函数的时候,称其为方法。通过o.m()来调用对象o中的m方法。
2.字符串,数字,布尔值并不是对象;[然而它们却有属性和方法]
3.为何会有属性和方法:只要引用了字符串s的属性,js就会将字符串值通过调用new String(s)的方式转换成对象,这个对象继承了字符串的方法,并没用来处理属性的引用。一旦属性引用结束。这个心创建的对象就会被销毁。
eg:

var s = "test";
s.zmm = 4;
var t = s.zmm;
console.log(t);

结果:t:underfined

分析:【属性zmm是自定义的】第二行代码创建一个临时的字符串对象,并给其zmm属性赋值为4,随即销毁这个对象。第三行通过原始字符串创建一个新字符串对象,尝试读取zmm属性,自zmm不存在,所以结果为underfined.

包装对象:存取字符串、数字或者布尔值的属性时创建的临时对象称做包装对象

然而可以通过String(),Number()或者Boolean()构造函数来创建对象。
eg:

var s = "mm", n = 3, b=true;
var S = new String(s); //一个字符串对象
var N = new Number(n);//一个数值对象
var B = new Boolean(b);//一个布尔对象

分析:s==S;n==N;b==B,然而全等===认为它们不等;

eg:

var s = "mm", n = 3, b=true;
var S = new String(s);
S.zmm = 4;
var t = S.zmm;
console.log(t);

结果:t:4


不可变的原始值和可变的对象引用

原始值:undefined null 布尔值 数字 字符串
对象:数组 函数 。。。。

原始值:

原始值不可更改,你以为改了字符串,其实只是返回一个新的字符串值,原始的字符串还是没变;
原始值的比较是值的比较,只有它们的值相等时它们才相等。
如果比较两个单独的字符串,当且仅当它们长度相等且每个索引的字符都相等时,才相等

eg:

var s ="Hello"
s.toUpperCase();
console.log(s);

结果:Hello

对象:

对象的值是可修改的;

eg:

var a={x:1}//定义一个对象
a.x=2;//通过修改对象属性值来更改对象
a.y=3;//给改对象增加一个新属性
console.log(a);

var b=[1,2,3]//定义一个数组
b[0]=0;//更改数组的一个元素
b[3]=4;//给数组增加一个新元素
console.log(b)

结果:

Object {x: 2, y: 3}
cal.html:76 [0, 2, 3, 4]

对象并非值的比较:即使两个对象包含同样的属性和相同的值。它们也是不相等的。各个索引元素完全相等的两个数组也不相等。

eg:

var g = {}, h = {}; //两个单独的空对象
console.log(g==h);
console.log(g===h);
var e = {x:1}, p = {x:1}; //具有相同属性的两个对象
console.log(e==p);
console.log(e===p);

var a = [], b = [];//两个单独的空数组
console.log(a==b);
console.log(a===b);
var c = [3,5], d = [3,5];//具有相同元素的两个数组
console.log(c==d);
console.log(c===d);

结果:全部都是false.

两个单独的对象永不相等;
两个单独的数组永不相等;


类型转换


转换和相等性

显示类型转换


对象转换为原始值


变量声明

声明变量的以下几种方法:

var a;
var b;

var a,b;

var a=3;
var a=3,b=4;

变量作用域

局部变量的优先级高于同名的全局变量
全局变量可以不用var来声明 eg: a=3;


函数作用域和声明提前

function test(o){
    var i = 0; //i在整个函数体内均是由定义的 
    if(typeof o == "object"){
        var j = 0; //j在函数体内是有定义的,不仅仅是在这个代码段内
        for(var k=0; k<10; k++){
            console.log(k);//k在函数体内是有定义的,不仅仅是在循环内
        }
        console.log(k);//k已经定义了,输出10

    } 
    console.log(j);//j已经定义了,但可能没有初始化

}

解释:
js中的函数作用域是指在函数内声明的所有变量在整个函数体内始终是可见的。这意味着变量在声明之前已经可用,这个特性被称为声明提前。可以假装一个js函数里声明的所有变量(不涉及赋值)都被“提前”至函数体的顶部。

更深刻的理解看下面的例子:

var a = 4;
function f(){
    console.log(a);//输出"undefined", 而不是"4"----变量a存在,但其值是"undefined";
    var a = 55;//变量在这里赋初始值,但变量本身在函数体内任何地方都是有定义的
    console.log(a);//输出"55"
}

解释:
由于函数域始终优先于全局域,所以局部变量a覆盖了与它同名的全局变量,由此,第一行不输出"4"。然而,只有程序在执行到var语句的时候,局部变量才会被真正赋值。

上述代码等价于:

function f(){
    var a;
    console.log(a);//变量a存在。但其值是"undefined";
    var a = 55;
    console.log(a);
}

表达式和运算符


语句


对象

除了 数字 字符串 布尔值(true false) null undefined 之外js中的值都是对象;其中字符串,数字,布尔值有属性和方法

三类js对象,两类属性

内置对象:数组,函数,日期,正则表达式
宿主对象:
自定义对象:运行中的Js代码创建的对象

自有属性:直接在对象中定义的属性
继承属性:在对象的原型对象中定义的属性


添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注