你的位置:首页 > Java教程

[Java教程]Javascript基础恶补


 

1、字符集:
Javascript采用Unicode字符集,支持地球上所有在用的语言。

2、区分大小写:
Javascript区分大小写,HTML不区分大小写。

3、空格、换行、格式控制符:
Javascript忽略空格、换行,可以采用整齐、一致的缩进来形成统一的编码风格。

4、Unicode转义序列:
使用6个ASCII字符来代表任意16位Unicode内码。这些Unicode转义序列均以\u为前缀,后跟4个十六进制数。

5、注释:
//单行注释的一种方式
/*单行注释的另一种方式*/

/*
多行注释
多行注释
*/


6、直接量
程序中直接能使用的值
1,2.1,"hello",true,null等

7、标识符
用来对变量或函数进行命名
以字母、_,$开头

8、保留字
也就是关键字,程序中不能使用Javascript中的默认关键字
比如break, delete, function, return, etc

9、可选的分号
如果语句独占一行,其后的分号可以省略。

■ 类型、值和变量

10、数据类型
能够表示并被操作的类型称作数据类型。

11、变量
用来标识值得符号名称,可以通过变量获得值得引用。

12、数据类型
原始类型primitive type和对象类型object type。
数字、布尔值、数字是原始类型。
null和undefined是两个特殊的原始类型。
对象是属性的键值对集合。
数组array是特殊的对象,定义了专用的语法。
函数也是特殊的对象,函数可看作相关联的可执行代码。

13、构造函数
使用new新建对象,称为构造函数。
构造函数定义的对象可以看作是一个类。
构造函数用来初始化对象。

14、系统默认类
Date代表日期的类。
RegExp表示正则表达式的类。
Error表示处理错误的类。

15、内存管理机制
解释器有自己的垃圾回收机制。
当不再有任何引用指向一个对象,自动回收占用的内存资源。

16、可变类型和不可变类型
不可变类型值不可以修改,可变类型值可以修改。
对象和数组属于可变类型。
数字、布尔值、null和undefined属于不可变类型。
字符串虽然可以看作是字符数组,但它是一个不可变类型。

17、数据类型转换
可以自由地进行数据类型转换。
在期望使用字符串的地方使用数字,会将数字自动转换成字符串。

18、变量是无类型的
变量可以被赋予任何类型的值
同样一个变量可以重新赋予不同类型的值
全局变量和函数内变量

19、整型直接量
● 十进制整型直接量
● 十六进制整型直接量,即以16为基数,以"0x"或"0X"开头,a-f或A-F表示10-15,比如0xff,就相当于15*16 + 15 = 255
● 有些支持八进制,以0开头,推荐不使用

20、浮点型直接量
● 包含整数部分、小数点、小数部分
● 还可以用指数计数法表示浮点,即在实数后跟字母e或E,3.02e23,表示3.02*10的23次方

21、算术运算符
● +, -, *, /,%
● Math对象
Math.pow(2,5) 2的5次幂
Math.round(.6) 四舍五入
Math.ceil(.6)向上求整
Math.floor(.6)向下求整
Math.abs(-2)绝对值
Math.max(x, y, z)
Math.min(x, y)
Math.random()0和1之间的随机数
Math.PI
Math.E 自然对数的底数e
Math.sqrt(3)平方根
Math.pow(3, 1/3)立方根
Math.sin(0), Math.cos, Math.atan
Math.log(10) 10的自然对数
...

22、算术溢出
溢出分为overflow, underflow,被零整除
溢出不会报错
Infinity表示正的无穷大
-Infinity表示负的无穷大
underflow是无限接近于零,分为0和-0
0处于零,报NaN,用来表示非数字值

23、判断非数字值
x!=x,当x且仅当x为NaN的时候,才为true
isNaN()函数也是相似的道理
isFine(),当参数不为NaN,Infinity,-Infinity的时候返回true

24、日期和时间
new Date(2010,0,1)
new Date(2010,0,1,17,10,30)
new Date()
getFullYear()
getMonth()
getDate()
getHours()
getUTCHours()

25、字符串
16位值组成,不可变,有序,序列
字符串用来表示文本
有长度length,索引从0开始
Javascript并没有表示单个字符的"字符型"
单引号中可以包含双引号
双引号中可以包含单引号
+字符串连接
length属性
charAt(0)
charAt()
subString(1,4)2到4号位值上的字符
slice(1,4)2到4号位值上的字符
slice(-2)最后2个字符
indexOf("1")
lastIndexOf("1")
split(",")
replace("","")
toUpperCase()

26、转义
\n表示另起一行
\反斜线转义

27、RegExp()函数
两条斜线之间的文本构成了正则表达式
/^HTML/以HTK开始的字符串

28、布尔值
if(o),当o为undefined, null, 0, -0, NaN为时为false

29、null和undefined
用来描述空值,是关键字
对null执行typeof返回object
当作为参数传入函数,推荐使用null。
undefined是变量的一种取值,表明变量没有被初始化。
查询对象属性或数组元素返回undefined,表示属性或元素不存在。
函数没有返回值,返回undefined。
引用没有提供函数形参对应实参时会得到undefined。

30、全局对象
● 全局属性:undefined, Infinity, NaN
● 全局函数:isNaN, parseInt, eval
● 全局对象:Date, Regexp, String, Object, Array

31、不可变原始值
undefined, null, 布尔值, 数字和字字符串,是原始值,不可更改。
原始值的比较是值的比较。

32、可变的对象引用
对象是可变的,对象的值是可以修改。
对象的比较不是值得比的比较

33、返回true的情形
null==undefined
"0"==0
0==false
"0"==false

34、一个值可以转换成另外一个值并不意味着两个值相等
if(undefined)返回false,并不说明undefined和false相等

35、显式类型转换
使用Boolean(), Number(), String(), Object()等函数。
Number("3")
String(false)
Boolean([])
Object(3)
null和undefined不能转化为对象

36、隐式类型转换
+ 作为字符串连接,把其中一个非字符串转换为字符串。
!将操作数转化为布尔值并取反

37、switch语句
switch(n){
    case 1:
        //语句
        break;
    case 2:
        //语句
        break;
    default:
        //语句
        break;
}

38、while
var count = 0;
while(count < 5){
    console.log(count);
    count++;
}

39、do/while
funnction printArray(a){
    var len = a.length, i = 0;
    if(len == 0){
        console.log("empty");
    } else {
        do {
            console.log(a[i]);
        } while (++i < len);
    }
}

40、for
for(var count = 0; count < 10; count++)


var i,j;
for(i=0, j=10; i < 10; i++, j--)

41、for/in
for(var pi in o)

42、break退出循环

for(var i = 0; i < a.length; i++){
    if(a[i]==target)
        break;
}

43、break 标签, 退出非就近的循环
var matrix = getData(); //得到一个二维数组
var sum = 0, success = false;
compute_sum: if(matrix){
    for(var x = 0; x < matrix.length; x++){
        var row = matrix[x];
        if(!row) break compute_sum;
        
        for(var y = 0; y < row.length; y++){
            var cell = row[y];
            if(isNan(cell)) break compute_sum;
            sum += cell;
        }
    }
    
    success = true;
}

44、continue
for(var i = 0; i  < data.length; i++){
    if(!data[i]) continue;
}

continue也可跟标签

45、throw

function factorial(x){
    if(x < 0){
        throw new Error("");
    }
}

46、try/catch/finally

try{
    
}
catch(ex){
    alert(ex);
}

46、with

with(document.forms[0]){
    name.value = "";
}

把document.forms[0]临时挂在作用域上。

47、debugger 临时调试

function f(o){
    if(o === undefined) debugger;
}

48、对象
属性的无序集合。
每个属性都是一个键值对。
属性名是字符串,从这点上可以把对象看成字符串到值得映射。
对象都有一个原型对象属性,实现"原型式继承",动态添加属性和方法。
对象的属性名不能重复。

49、对象直接量创建对象

var empty = {};
var book = {
    "main title": "" //属性名有空格必须用引号
}

保留字作为属性名,必须用引号。
最后一个属性的属性值后的逗号可以省略。

50、通过new创建对象

var o = new Object();
var a = new Array();
var d = new Date();
var r = new RegExp("js");

51、Object.create()创建对象

var o1 = Object.create({x:1,y:2});

//创建普通的空对象
var o = Object.create(Object.prototype);

//等同于
{}和new Object()

52、通过原型继承创建一个新对象

function(p){
    if(p == null)
        throw TypeError();
    if(Object.create)
        return Object.create(p);
        var t = typeof p;
        if(t !== "object" && t !=="function")
            thrwo TypeError();
            
        function f(){}
        f.prototype = p;
        return new f();
}

53、对象属性的查询和设置

给null或undefined设置属性值会报类型错误
有一些属性是只读的,也不能设置。
var a = book.author;
var t = book["main title"];
book.edition=6;
book["main title"] ="";
查询对象并不存在的属性不抛异常抛undefined:book.x; // undefined
对象不存在抛异常:book.x.length

//加判断防止抛异常或undefined
var len = undeinfed;
if(book){
    if(book.x){
        len = book.x.length;
    }
}

//一种更简洁的写法
var len = book && book.x && book.x.length;

54、删除对象属性

delete book.author;
delete book["main title"];
delete只能删除自有属性,不能删除继承属性。
删除成功或没有任何副作用返回true。

55、检测对象属性
var o = {x:1};
"x" in o
o.hasOwnProperty("x")

56、遍历对象属性

var o = {x:1, y:2};
for(p in o){
    console.log(p);
}

还可以对对象属性过滤。

for(p in o){
    if(!o.hasOwnProperty(p)) //跳过继承的属性
        continue;
}

for(p in o){
    if(typeof o[p] === "function"){
        continue;
    }
}

57、对象属性getter和setter

var o = {
    data_prop:value,
    get accessor_prop(){},
    set accessor_prop(value){}
}

58、对象属性的特性

用来表述属性的属性。
Object.getOwnPropertyDescriptor({x:1},"x");
Object.getOwnPropertyDescriptor(random, "someprop");

59、对象的原型属性
在实例对象创建之前就设置好的。
Object.prototype
查看对象的原型Object.getPrototypeOf(把对象作为实参)
检测p是否是o的原型:p.isPrototypeOf(o)

60、对象的类属性
字符串,表示对象的类型信息
toString()方法查询它

61、对象的可扩展性
表示是否可以给对象添加新属性
Object.isExtensible()

62、序列化对象
将对象与字符串之间进行转换。
把对象转换为字符串用:JSON.stringfy()
把字符串转换为对象用:JSON.parse()

63、对象的方法
所有的对象从Object.prototype继承属性。
toString()
toLocalString()
valueOf()

64、数组
数组是值的有序集合。
每个值叫数组元素。
每个元素在数组中的位置就是索引。

65、创建数组
var a = [];
数组元素可以是直接量、表达式、对象
var a = new Array();

66、数组元素读写
var a = ["world"];
var value = a[0];
a[1] = 3;

67、稀疏数组
数组的长度大于元素个数。
a = new Array(5);

68、数组元素的添加和删除
a = [];
a[0]="";
a[1]="";
a.push("");
delete a[1]索引为1的位置不能再有元素

69、数组遍历
for(var i =0; i < keys.length; i++)
for(var i = 0, len = keys.length; i < len; i++)
for(var index in sparsArray)
data.forEach()

70、多维数组
var talbe = new Array(10);
for(var i = 0; i < table.length; i++){
    tables[i] = new Array(10);
    for(var row = 0; row < table.legnth; row++){
        for(col=0; col < tables[row].lenght; col++){
            table[row][col] = row*col;
        }
    }
}

71、数组方法
a.join("")
a.reverse()
s.sort()
a.concat()
Array.slice()获取数组片段
Array.splice向数组插入或删除元素
push()和pop()
shift()和unshift()

72、ECMAScript5中的数组方法
forEach(),map(), filter(), every(), some(), reduce(), reduceRight(),indexOf(), lastIndexOf()

73、判断数组类型
Array.isArray([]), Array.isArray({})

74、函数
函数是一段代码。
函数的形参像局部变量一样工作。
函数调用会为形参提供实参的值。
每次调用会有一个上下文。
函数挂在对象上,就是对象方法。
调用对象方法,上下文就是该对象。
初始化一个新创建对象的函数交构造函数。
函数就是对象,可以把函数赋值给变量,把函数作为参数,也可把函数作为属性值。
函数可以被包含在函数内,外层的函数就是作用域,内层的函数可以使用作用域内的变量,这就是闭包。

75、函数作为值
函数可以赋值给变量,赋值给对象的属性,赋值给数组元素。

//赋值给变量
function square(x){
    return x*x;
}
var s = square;

//赋值给属性
var o = {
    square: function(x){
        return x * x;
    }
}
o.squre(6);

//赋值给数组元素
var a = [function(x){return x*x;},20];
a[0](a[1]);

76、自定义函数属性
函数是特俗的对象,可以拥有属性。
fn.counter = 0;
function fn(){
    return fn.counter++;
}

77、call()和apply()方法
以对象o的方法来调用函数f。
f.call(o)
f.apply(o)

f.call(o, 1, 2);
f.apply(o, [1, 2])

78、Function()构造函数
var f = new Function("x", "y", "return x*y;");

79、类
基于原型的继承机制。
类是动态可继承。
类的所有实例对象都从同一个原型对象上继承属性。

80、类和构造函数
构造函数用来初始化新创建的对象。
new调用构造函数。
调用构造函数就是把prototype属性用作新对象的原型。
function Range(from, to){
    this.from = from;
    this.to = to;
}

Range.prtotype = {
    includes: function(x){
        return this.from <=x && x <= this.to;
    },
    foreach: function(f){
        for(var x = Math.ceil(this.from); x <= this.to; x++)
            f(x);
    }
};

81、类原型的constructor属性
var F = function(){};
var p = F.prototype;
var c = p.constructor;
c===F

82、类的继承

class Animal{
    constructor(voice){
        this.voice = voice || '';
    }
    
    speak(){
        display(this.voice);
    }
}

class Cat extends Animal{
    constructor(name, color){
        super('Meow')
        this.name = name
        this.color = color
    }
}

var fulffy = new Cat('fluffy', 'White');
fluffy.speak();