[关闭]
@Andream 2017-11-11T17:23:57.000000Z 字数 4301 阅读 667

JavaScript VS Java

未分类


因为之前学过C C++ Java,在学JavaScript的时候能发现很多相似之处。我觉得把他们的不同之处罗列出来不失为一种学习新语言的办法。

一、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数组访问参数

  1. function name(arg0, arg1, ... , argn){
  2. statements
  3. }

四、变量、作用域、内存

基本类型按值复制,Object为引用类型按引用复制
作用域:全局作用域 / 函数作用域,没有代码块作用域。在catch和with中的变量作用域被延长
内存管理:通过垃圾回收机制清理无用内存,对于全局变量,建议手动解除引用(置null)

五、引用类型

Object

  1. // WAY01: by new operator
  2. var person = new Object();
  3. person.name = "Eyre";
  4. person.age = 19;
  5. // WAY02: json格式
  6. var person = {
  7. name : "Eyre",
  8. age : 19
  9. };
  10. // 还可以通过[]访问属性
  11. alert(person["name"]); // 适用于变量名包含特殊字符,还可以用变量做变量名
  12. alert(person.name); // 但一般推荐用.运算符

Array

  1. // 声明
  2. var colors = new Array();
  3. var colors = new Array(20);
  4. var colors = new Array("red", "green", "blue");
  5. var colors = ["red", "green", "blue"];
  6. // 访问:读 & 写
  7. alert(colors[0]);
  8. alert(colors[100]); // undefined
  9. alert(colors.length);
  10. colors[5] = "brown"; // 越界会自动增长
  11. colors.length = 2; // length可写!自动在末尾增长或缩短数组
  12. // 转字符串
  13. alert(colors.toString()); // red,green,blue
  14. alert(colors.join('|')); // red|green|blue
  15. // 作为栈
  16. var count = colors.push("balck");
  17. var item = colors.pop();
  18. // 作为队列
  19. var count = colors.push("balck"); // 后端入队
  20. var item = colors.shift(); // 前端出队
  21. count = colors.unshift("brown"); // 前端入队
  22. item = colors.pop(); // 后端出队
  23. // 排序
  24. colors.reverse();
  25. colors.sort();
  26. colors.sort(compare);
  27. // 查找(要求全相等)
  28. colors.indexOf("green");
  29. colors.lastIndexOf("green");
  1. // 其它函数
  2. // 组装
  3. colors.concat("yellow", ["orange", "white"]); // red,green,blue,yellow,orange,white
  4. // 子数组
  5. var subcolors = colors.slice(1, 3); // green,blue,支持反向索引
  6. // 替换(可实现插入、删除)
  7. colors.splice(1, 2, "purple", "gray"); // 从1号位删除2项,再添加两个颜色
  8. colors.splice(1, 0, "purple", "gray"); // 从1号位删除0项,添加两个颜色
  9. colors.splice(0, 2); // 从0号位往后删除2项,什么也不添加
  10. // 迭代
  11. colors.forEach();
  12. colors.filter();
  13. colors.map();
  14. colors.every();
  15. colors.some();

Date

  1. // 和Java一样采用UTC时间,以1970.1.1为基准
  2. var now = new Date(); // 默认为当前时间
  3. var sometime = new Date(timeInMillons); // 传入毫秒数
  4. // 解析时间,返回毫秒数
  5. Date.parse("6/13/2004");
  6. Date.parse("2017-11-11T11:11:11"); // ISO标准,要求ES5以上
  7. Date.UTC(2017, 10, 10, 11, 11, 11); // 2017-11-11 11:11:11所有参数从0开始计算
  8. Date.now(); // ES5
  9. // 获取日期的时间戳
  10. var millons = +new Date();
  11. // 转字符串
  12. toDateString()
  13. toTimeString()
  14. toLocaleDateString()
  15. toLocaleTimeString()
  16. toUTCString()
  17. // 读写年月日时分秒毫秒
  18. ...

RegExp

类似perl的语法创建正则表达式

  1. 模式(pattern):不赘述
  2. 标志(flag):JS中有三种标志:g i m
  3. g // 全局模式
  4. i // 忽略大小写
  5. m // 多行模式

声明:模式+标志就构成一个正则表达式,举例如下:

  1. // 字面量
  2. pattern = /at/g // 匹配所有包含`at`的实例
  3. pattern = /[bc]at/i // 匹配第一个bat或cat,不区分大小写
  4. pattern = /\[bc\]at/gi // 匹配所有[bc]at,不区分大小写
  5. ...
  6. // new
  7. pattern = new RegExp("at", "g");
  8. pattern = new RegExp("[bc]at", "i");
  9. pattern = new RegExp("\\[bc\\]at", "gi");

属性

  1. pattern.global
  2. pattern.ignoreCase
  3. pattern.multiline
  4. pattern.lastIndex // 开始搜索的位置,以0开始
  5. pattern.source // 正则的字符串表示

函数:

  1. // exec对指定文本开始查找
  2. var pattern = new RegExp("[bc]at", "i");
  3. var matches = pattern.exec("there is no cat");
  4. // toString() 返回字面量

静态属性

  1. RegExp.input
  2. RegExp.lastMatch
  3. RegExp.lastParen
  4. RegExp.leftContext
  5. RegExp.multiline
  6. RegExp.rightContext

局限(略)

Function

在JS中,函数其实是对象,每个函数都是Function类型的一个实例。

声明

  1. // 函数声明
  2. function sum(num1, num2){
  3. return num1 + num2;
  4. }
  5. // 函数表达式
  6. var sum = function(num1, num2){
  7. return num1 + num2;
  8. }
  9. var sum = new Function("num1", "num2", "return num1 + num2;"); // 不推荐
  10. 函数声明和函数表达式的区别:函数表达式不能做`函数声明提升`
  11. 通过前者定义的函数,调用语句可以在声明语句之前,而后者不可以。
  12. 没有重载(因为函数其实是变量,不能存在同一变量引用两个函数)

属性

  1. arguments // 参数
  2. arguments.callee
  3. arguments.caller
  4. this // 环境
  5. length // 期望参数个数
  6. prototype // 待研究

方法

  1. apply(this, arguments)
  2. call()
  3. // 相当于设置函数的上下文和参数,区别是call必须将参数列出
  4. // 这俩函数牛逼之处在于:扩充函数赖以运行的作用域,例:
  5. window.color = 'red';
  6. var o = {
  7. color = 'blue;
  8. };
  9. function sayColor(){
  10. alert(this.color);
  11. }
  12. sayColor(); // red
  13. sayColor.call(this); // red
  14. sayColor.call(window); // red
  15. sayColor.call(o); // blue
  16. // ES5还有个bind()函数

基本包装类型

  1. // Boolean // 尽量别用,容易引起误会
  2. // Number
  3. var num = 10;
  4. num.toFixed(2); // 10.00
  5. num.toExponential(); // 1.0e+1
  6. num.toPrecision(x); // x位有效数字
  7. // String 支持反向索引
  8. // 字符
  9. var str = "hello world";
  10. str.length // 11,当包含双字节字符时,依然是11
  11. str.charAt(int)
  12. str.charCodeAt(int)
  13. str[i]
  14. // 字符串
  15. str.concat("!!!", "..."); // hello world!!!...
  16. str.slice();
  17. str.substring();
  18. str.substr();
  19. str.trim(); // 清除前后空格 ES5
  20. str.toLowerCase();
  21. str.toUpperCase();
  22. // 位置
  23. str.indexOf('o', 2);
  24. str.lastIndexOf('l', 6);

单体内置对象(由ES实现的预置对象)

  1. Global
  2. encodeURI()
  3. encodeURIComponent()
  4. eval()
  5. window
  6. Math
  7. 属性
  8. E
  9. PI
  10. ...
  11. 函数
  12. min max ceil floor round random
  13. 其他的和java很像
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注