@Andream
2017-11-11T09:23:57.000000Z
字数 4301
阅读 808
未分类
因为之前学过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 operatorvar 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]); // undefinedalert(colors.length);colors[5] = "brown"; // 越界会自动增长colors.length = 2; // length可写!自动在末尾增长或缩短数组// 转字符串alert(colors.toString()); // red,green,bluealert(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 mg // 全局模式i // 忽略大小写m // 多行模式
声明:模式+标志就构成一个正则表达式,举例如下:
// 字面量pattern = /at/g // 匹配所有包含`at`的实例pattern = /[bc]at/i // 匹配第一个bat或cat,不区分大小写pattern = /\[bc\]at/gi // 匹配所有[bc]at,不区分大小写...// newpattern = new RegExp("at", "g");pattern = new RegExp("[bc]at", "i");pattern = new RegExp("\\[bc\\]at", "gi");
属性
pattern.globalpattern.ignoreCasepattern.multilinepattern.lastIndex // 开始搜索的位置,以0开始pattern.source // 正则的字符串表示
函数:
// exec对指定文本开始查找var pattern = new RegExp("[bc]at", "i");var matches = pattern.exec("there is no cat");// toString() 返回字面量
静态属性
RegExp.inputRegExp.lastMatchRegExp.lastParenRegExp.leftContextRegExp.multilineRegExp.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.calleearguments.callerthis // 环境length // 期望参数个数prototype // 待研究
方法
apply(this, arguments)call()// 相当于设置函数的上下文和参数,区别是call必须将参数列出// 这俩函数牛逼之处在于:扩充函数赖以运行的作用域,例:window.color = 'red';var o = {color = 'blue;};function sayColor(){alert(this.color);}sayColor(); // redsayColor.call(this); // redsayColor.call(window); // redsayColor.call(o); // blue// ES5还有个bind()函数
// Boolean // 尽量别用,容易引起误会// Numbervar num = 10;num.toFixed(2); // 10.00num.toExponential(); // 1.0e+1num.toPrecision(x); // x位有效数字// String 支持反向索引// 字符var str = "hello world";str.length // 11,当包含双字节字符时,依然是11str.charAt(int)str.charCodeAt(int)str[i]// 字符串str.concat("!!!", "..."); // hello world!!!...str.slice();str.substring();str.substr();str.trim(); // 清除前后空格 ES5str.toLowerCase();str.toUpperCase();// 位置str.indexOf('o', 2);str.lastIndexOf('l', 6);
GlobalencodeURI()encodeURIComponent()eval()windowMath属性EPI...函数min max ceil floor round random其他的和java很像