@Andream
2017-11-11T17:23:57.000000Z
字数 4301
阅读 667
未分类
因为之前学过C C++ Java,在学JavaScript的时候能发现很多相似之处。我觉得把他们的不同之处罗列出来不失为一种学习新语言的办法。
它创立之初是为了做浏览器脚本,在浏览器中运行,而不是直接运行在操作系统上。或者说,浏览器就是JS的虚拟机。
所以除了编程语言本身,JS还实现了:
1、文档对象模型(DOM) —— 操作HTML的接口
通过Java当然也可以操作HTML,但是需要导入相关的库,而且操作肯定复杂很多。而JS作为一门生来就要和HTML打交道的语言,在这方面做了大量的工作,使得操作HTML非常便捷。
2、浏览器对象模型(BOM) —— 通过浏览器提供给JS额外的功能的接口
因为浏览器是直接运行在操作系统上的,它能做的事情更多,例如打开某个软件,提供设备分辨率,缩放窗口大小...
而对比之下,Java的虚拟机并没有给Java提供额外的接口。原因在于Java虚拟机只是运行环境,而浏览器不光是运行环境,还包括了用户界面吧。
命名:变量名和函数名可以以$开头
严格模式:"use strict",用于防止过于松散的语法
变量:松散类型,使用var定义。共6种:Undefined, Null, Boolean, Number, String, Object
操作符:无符号移位<<<
>>>
相等==
全等===
语句:for-in
with
switch
可以选择任何类型
函数:无需声明返回值类型,没有重载,可以通过arguments数组访问参数
function name(arg0, arg1, ... , argn){
statements
}
基本类型按值复制,Object为引用类型按引用复制
作用域:全局作用域 / 函数作用域,没有代码块作用域。在catch和with中的变量作用域被延长
内存管理:通过垃圾回收机制清理无用内存,对于全局变量,建议手动解除引用(置null)
// WAY01: by new operator
var person = new Object();
person.name = "Eyre";
person.age = 19;
// WAY02: json格式
var person = {
name : "Eyre",
age : 19
};
// 还可以通过[]访问属性
alert(person["name"]); // 适用于变量名包含特殊字符,还可以用变量做变量名
alert(person.name); // 但一般推荐用.运算符
// 声明
var colors = new Array();
var colors = new Array(20);
var colors = new Array("red", "green", "blue");
var colors = ["red", "green", "blue"];
// 访问:读 & 写
alert(colors[0]);
alert(colors[100]); // undefined
alert(colors.length);
colors[5] = "brown"; // 越界会自动增长
colors.length = 2; // length可写!自动在末尾增长或缩短数组
// 转字符串
alert(colors.toString()); // red,green,blue
alert(colors.join('|')); // red|green|blue
// 作为栈
var count = colors.push("balck");
var item = colors.pop();
// 作为队列
var count = colors.push("balck"); // 后端入队
var item = colors.shift(); // 前端出队
count = colors.unshift("brown"); // 前端入队
item = colors.pop(); // 后端出队
// 排序
colors.reverse();
colors.sort();
colors.sort(compare);
// 查找(要求全相等)
colors.indexOf("green");
colors.lastIndexOf("green");
// 其它函数
// 组装
colors.concat("yellow", ["orange", "white"]); // red,green,blue,yellow,orange,white
// 子数组
var subcolors = colors.slice(1, 3); // green,blue,支持反向索引
// 替换(可实现插入、删除)
colors.splice(1, 2, "purple", "gray"); // 从1号位删除2项,再添加两个颜色
colors.splice(1, 0, "purple", "gray"); // 从1号位删除0项,添加两个颜色
colors.splice(0, 2); // 从0号位往后删除2项,什么也不添加
// 迭代
colors.forEach();
colors.filter();
colors.map();
colors.every();
colors.some();
// 和Java一样采用UTC时间,以1970.1.1为基准
var now = new Date(); // 默认为当前时间
var sometime = new Date(timeInMillons); // 传入毫秒数
// 解析时间,返回毫秒数
Date.parse("6/13/2004");
Date.parse("2017-11-11T11:11:11"); // ISO标准,要求ES5以上
Date.UTC(2017, 10, 10, 11, 11, 11); // 2017-11-11 11:11:11所有参数从0开始计算
Date.now(); // ES5
// 获取日期的时间戳
var millons = +new Date();
// 转字符串
toDateString()
toTimeString()
toLocaleDateString()
toLocaleTimeString()
toUTCString()
// 读写年月日时分秒毫秒
...
类似perl的语法创建正则表达式
模式(pattern):不赘述
标志(flag):JS中有三种标志:g i m
g // 全局模式
i // 忽略大小写
m // 多行模式
声明:模式+标志就构成一个正则表达式,举例如下:
// 字面量
pattern = /at/g // 匹配所有包含`at`的实例
pattern = /[bc]at/i // 匹配第一个bat或cat,不区分大小写
pattern = /\[bc\]at/gi // 匹配所有[bc]at,不区分大小写
...
// new
pattern = new RegExp("at", "g");
pattern = new RegExp("[bc]at", "i");
pattern = new RegExp("\\[bc\\]at", "gi");
属性
pattern.global
pattern.ignoreCase
pattern.multiline
pattern.lastIndex // 开始搜索的位置,以0开始
pattern.source // 正则的字符串表示
函数:
// exec对指定文本开始查找
var pattern = new RegExp("[bc]at", "i");
var matches = pattern.exec("there is no cat");
// toString() 返回字面量
静态属性
RegExp.input
RegExp.lastMatch
RegExp.lastParen
RegExp.leftContext
RegExp.multiline
RegExp.rightContext
局限(略)
在JS中,函数其实是对象,每个函数都是Function类型的一个实例。
声明
// 函数声明
function sum(num1, num2){
return num1 + num2;
}
// 函数表达式
var sum = function(num1, num2){
return num1 + num2;
}
var sum = new Function("num1", "num2", "return num1 + num2;"); // 不推荐
函数声明和函数表达式的区别:函数表达式不能做`函数声明提升`。
通过前者定义的函数,调用语句可以在声明语句之前,而后者不可以。
没有重载(因为函数其实是变量,不能存在同一变量引用两个函数)
属性
arguments // 参数
arguments.callee
arguments.caller
this // 环境
length // 期望参数个数
prototype // 待研究
方法
apply(this, arguments)
call()
// 相当于设置函数的上下文和参数,区别是call必须将参数列出
// 这俩函数牛逼之处在于:扩充函数赖以运行的作用域,例:
window.color = 'red';
var o = {
color = 'blue;
};
function sayColor(){
alert(this.color);
}
sayColor(); // red
sayColor.call(this); // red
sayColor.call(window); // red
sayColor.call(o); // blue
// ES5还有个bind()函数
// Boolean // 尽量别用,容易引起误会
// Number
var num = 10;
num.toFixed(2); // 10.00
num.toExponential(); // 1.0e+1
num.toPrecision(x); // x位有效数字
// String 支持反向索引
// 字符
var str = "hello world";
str.length // 11,当包含双字节字符时,依然是11
str.charAt(int)
str.charCodeAt(int)
str[i]
// 字符串
str.concat("!!!", "..."); // hello world!!!...
str.slice();
str.substring();
str.substr();
str.trim(); // 清除前后空格 ES5
str.toLowerCase();
str.toUpperCase();
// 位置
str.indexOf('o', 2);
str.lastIndexOf('l', 6);
Global
encodeURI()
encodeURIComponent()
eval()
window
Math
属性
E
PI
...
函数
min max ceil floor round random
其他的和java很像