美文网首页
JavaScript 基本语法(一)

JavaScript 基本语法(一)

作者: AlexLJS | 来源:发表于2020-01-24 18:32 被阅读0次


自学JS时所记的笔记,方便以后查找,主要是记录一些心得,使用的话要翻看 js 文档。

目前,要用好JS是不可避免地要学习一下ES6的文档。这里我不做分别,ES6改动已融合进文章。

一定边开发边结合 Doc : 菜鸟教程 , 阮一峰 , MDN 都是不错的选择。

奇怪的JavaScript


1 、 变量 :
var 声明 , 局部变量。 不用var 也可以声明,全局变量??(不推荐使用)

因为js 是一个弱类型语言,java程序员过来肯定是非常难受的。其实实际生产中,var声明的变量往往是全局变量,而const 和 let 声明的局部变量!因为js 存在变量作用域概念,nodejs脚本还是web的script脚本,var的作用域都是当前脚本,而后两者是块级作用域,更贴近于java的声明。

const a = [1,2,4];
const b = "abc";

简单数据类型,const 变量在初始化时必须赋值,且不可改变,
对于复杂数据类型,const 为固定索引,但是你可以改变指向内存的值。

2、数据类型 :
5种简单数据类型: (ES6中有变化)
Undefined、boolean、string、number、null
1种复杂数据类型:
object
然而,使用 typeof查看类型却能返回6种值??能返回function。而typeof(null) 返回object,表明null是一种object的引用!更令人匪夷所思斯的是,string 可以自动转型成boolean???

var message = "Hello";
if (message) {
  alert("true");
}

WTF?
这在Java中几乎是不可理解的: 在后期编程中,这个问题始终困扰我,在这里解释一下:null 、 undefined、 true 、 false (undefined: var 声明 未初始化的变量,以及未声明的变量)
根据常识,我们很容易认为后两者boolean 类型,前两者分别是null 、 undefined。但是 typeof null ,返回object!null == undefined ,返回true!这就是js这门语言的“垃圾”之处,是设计缺陷,我们只能强行解释:undefined是null派生来的, 所以 null == undefined ;null 设计之初表示Object没有引用(指针),所以null是空指针占位的object!而 undefined表示未定义的变量,类似于 var a; 没对a进行其他操作,a就是undefined。实际中,数据接口有字段名没字段值,这种情况都是undefined。还有一奇怪之处,就是对于 undefined 和null的对象,他们在判断条件需要boolean的位置都代表false,反之如果“有”这个对象,则表示true!但是 undefined / null 与true/false又都不相等 ,因为他们类型不同!
这里的奇怪程度,估计可以劝退许多喜欢强类型语言的coder。个人观点:正是由于这种不严谨,导致js前端迅速流行,不用考虑数据类型强转,浏览器解析迅速兼容。

实际上,对于js数据类型的理解跟很多语言类似只有两种数据类型:值类型、引用数据类型。引用数据类型(Object)又被分为了好多种,说这是设计缺陷也不为过。ES6中多了一个数据类型 Symbol变为了6种数据类型,这个Symbol更需要一定的理解门槛,为大项目开发准备的。
参考:http://es6.ruanyifeng.com/#docs/symbol
简言之,Symbol维护全局变量、创建私有属性。但是 Symbol()的创建方式没有关键字new 是否不够规范?

3、数字与字符串

number 使用还是比较正常的, 同样浮点数会损失精度, 八进制用 0 ,十六进制 0X。
最大范围最小范围 Number.MAX_VALUE ,数值有穷判断 isFinite()……
NaN : 非数值,与任何数值都不相等, 非数值判断 isNaN()

奇怪的是:isNaN("blue") 返回 true ! ‘blue’ 被转为数值型,而他是非数值,so ……True!足见这门语言设计的有缺陷。

数值转换函数 : Number() 、parseInt()、 parsefloat()…
每个函数都有各自奇怪的用法, 见《JavaScript高级程序设计》(第三版)P31
(手头书比较老 , 下同)

string 比较正常 , 也是不可变类型 ,转换为字符串方法 : toString()

4、Object
多功能 var 0 = new object();
一些用法 见P35 , 在开发中我比较常用 Object.keys(XXX)Object.assign({},XXX)

5、流程控制:
一些和java 不同: foreach 使用的是 for( in)

制定循环层 label : for 。。。用于多层循环跳出。

大部分时间都是用 ES6 的 foreach, 方法非常强大除了不能continue

6、函数 fuction :
奇怪的函数,十分随意 :不用写返回值、不用写返回类型!唉……

模糊传参:动态参数,在函数内部使用 arguments[]数组, 传入的参数都写在数组中,动态取用。 可以根据数组长度实现一些不完美的重载。(参数核验,鲁棒性欠佳)

function abc() {
    return arguments.length; 
}
alert(abc(1,2,3,4,5,6));

7、内存:
引用类型的变量 (Object)的值,按照引用访问。
判断 引用类型变量类型 : instanceof
常用 a instanceof Array , 亦可是自定义的类 。

8、作用域扩展:
真是奇怪的语言, 没有 “块级作用区域” , (ES6 得到了一定的解决)有一个叫做 “执行环境” 的东西 , 简言之 : 函数体内的初始化变量 全部在同一个执行环境中。

{ // with 的执行环境
  with(something){ 可以访问其他作用于的some 对象 }
}

无块级作用域代码示例 :

var color = "blue";
function getColor(){
  var color = "red";
  return color;
}
console.log(getColor());//red
console.log(this.color);//blue

尽管 , 第一个color 是全局变量 , 当前环境还是先找到函数内部的color。奇怪的是,即使是这样,环境不同同名变量也没有被覆盖掉,例如this.color, 这样会造成莫名的引用bug。注 : web页面 window.color; window 是最大的执行环境 ,脚本则为this, 执行环境绑定可以使用bind(this) 将一个函数的执行环境绑定到脚本中 。

引用类型


1、Object
上面已经提到了一些 Object方法, 但是js 中的Object就是 JSON 对象 (JavaScript Object Notation) 样式上类似于Map 键值对的数据交换格式,底层如何实现没有示例考察源码 ,json的与其他数据结构的转换 是非常方便的。

//声明
var person = {
  "name" : "Alex";
  “age” : 24
};
//调用
person.name;

JSON 是js 中的全局变量,提供很多转化操作

var person = {
  "name" : "Alex";
  “age” : 24
};
var personStr = JSON.stringify();//等效 person.toJSONString(); 
var personAgain = JSON.parse(personStr);

json 遍历

for (let key in json){ 
    console.log(key + ":" + json[key]);
}

2、数组 Array
数组在js中也是比较奇特的、使用频率很高的存在。

var ary = new Array(20);//创建一个20长度的数组。
var ary2 = ["a","b","c"] ;

更令人惊叹的是, 把queue 、stack 与Array整合在一起!!构造出了一种集合这三者数据结构有点的 数组数据结构!可以 push() 、pop() ,也可以用 队列 shift() , 还能双向队列,反向推入 unshift() ……感觉方便的同时 ,又像被喂了一口shit , 不由得“真香”警告! 最常用的还是 concat() join() splice() slice() ……

排序 reverse() sort()
sort(compare(v1,v2)) 可传入比较函数 , 返回-1 1 0分别代表“小、大、相等”

filter() 筛选:
可以在forEach 之前filter 进行 条件范围筛选。

ary.filter((val,index)=>{return val > 1;}).forEach( v , k ){
  console.log( v  ); // 输出  > 1 数
} 

map

1,js创建map对象
var map = new Map();

2.将键值对放入map对象

map.set("key",value)
map.set("key1",value1)
map.set("key2",value2)

3.根据key获取map值
map.get(key)

4.删除map指定对象
delete map[key]

5.循环遍历map

map.forEach(function(value,key){
  console.log(value,key)  //输出的是map中的value值

})

Set

核心数据结构 , set 用来去重 。
set.add()
set.has()
set.size
set.delete()
Set 用来做一些集合运算 (差、并、补) , 见 MDN-set

相关文章

  • JavaScript01_基础知识

    一、基本语法 基本语法 JavaScript的每个语句以;结束,语句块在花括号内{...}。 JavaScript...

  • JavaScript基本语法03

    原文博客地址: JavaScript基本语法03 书接上文JavaScript基本语法, 记录了JavaScrip...

  • JavaScript基本语法(一)

    目录 变量 1.什么是变量2.为什么要使用变量3.变量如何使用4.原理图5.变量命名规则和规范6.变量的交换 数据...

  • JavaScript基本语法(一)

    一、语句 JavaScript语言的执行单位为line,也就是一行一行的执行。一般情况下,每一行为一个语句。 语句...

  • JavaScript基本语法(一)

    目录 1. 语句 2. 变量 3. 小结 JavaScript基本语法(一)是JavaScript核心知识点(EC...

  • JavaScript 基本语法(一)

    总 自学JS时所记的笔记,方便以后查找,主要是记录一些心得,使用的话要翻看 js 文档。 目前,要用好JS是不可避...

  • JavaScript基本语法(一)

    JavaScript与java的区别 java和JavaScript完全是两个不同的产品,java是面向对象程序设...

  • JavaScript(一)基本语法

    JavaScript语法基础 词法规则 1、区分大小写2、忽略空白符和换行符3、可选的分号,半角分号(;)表示一个...

  • JavaScript基本语法(一)

    标识符: 1.由大小写字母,数字,下划线,和美元符合($)组成 2.不能以数字开头 3.是...

  • JavaScript基本语法(一)

    标识符:1.由大小写字母,数字,下划线,和美元符合($)组成2.不能以数字开头3.是严格区分大小写的(例如 it ...

网友评论

      本文标题:JavaScript 基本语法(一)

      本文链接:https://www.haomeiwen.com/subject/zgwzvctx.html