JS学习(二)——词法结构和类型、变量

 

 

JS的基本要点

1. js程序是用Unicode字符集编写;

2. js是区分大小写的语言,但值得注意的是js的客户HTML不区分大小写,这就很容易混淆,例如:在html的标签中的onclick属性可以写成onClick,但是在js中必须是小写;

 

JS的关键字

// ES6中的关键字(其中有一些是保留字)
abstract	arguments	boolean	break	byte
case	catch	char	class	const
continue	debugger	default	delete	do
double	else	enum	eval	export
extends	false	final	finally	float
for	function	goto	if	implements
import	in	instanceof	int	interface
let	long	native	new	null
package	private	protected	public	return
short	static	super	switch	synchronized
this	throw	throws	transient	true
try	typeof	var	void	volatile
while	with	yield

 

1. nullundefinedundefined的区别

  就类型而言,null的类型是 “object”, undefined的类型也是 “undefined”,而NaN的类型是“number”;未定义的值和定义未赋值的为undefined,null是一种特殊的object,NaN是一种特殊的number。

var a1;
var a2 = true;
var a3 = 1;
var a4 = "Hello";
var a5 = new Object();
var a6 = null;
var a7 = NaN;
var a8 = undefined;
alert(typeof a);    //显示"undefined"
alert(typeof a1); //显示"undefined"
alert(typeof a2); //显示"boolean"
alert(typeof a3); //显示"number"
alert(typeof a4); //显示"string"
alert(typeof a5); //显示"object"
alert(typeof a6); //显示"object"
alert(typeof a7); //显示"number"
alert(typeof a8); //显示"undefined"


alert(null == undefined) // 输出true
alert(NaN == NaN)        //输出false , NaN表示“非数值”,自己也不等于自己本身

当作为if的条件时,null和undefined都会隐性的转化成为false,实际上,undefined值是派生null值的,所以当比较它俩的值时返回true。

2. letvar 的区别

  let 与 var  的区别本质上就是作用域的区别!!!具体看下面代码例子与注释

// test.js

/***************************************************
 * 声明:let 声明的变量是唯一的, var声明的变量可以多次声明
 ***************************************************/
var x;
let y;
console.log('x: ', x);    // 输出undefined
console.log('y: ', y);    // 输出undefined
var x = 1;     //不报错,x的值为1
var x;     //声明且不赋值,不报错,x的值仍为1
let y;    // 报错,不能重复声明

/*******************************************
 * 作用域
 *****************************************/
x = 1;
function func() {
    console.log('x in function is : ', x);      // 输出x in function is :  1
    console.log('y in function is : ', y);      // 输出y in function is :  undefined
}
func();

{
    let a = 10;
    var b = 11;
}
console.log(a);   // 报错,a不存在
console.log(b);   // 输出 11

/*******************************************
 * 奇妙的for循环:for的条件相当于父
 ******************************************/

// 使用let的for循环
for (let i = 0; i < 3; i++) {
    let i = 'abc';
    console.log(i);                 // 使用let,循环总共输出三个‘abc’, for循环的条件与循环内容相当于两个作用域,即循环条件的 “i” 与循环体里的“i” 不是同一个变量; 若换做var他们就相当于共同的变量
  }
console.log(i);  // ReferenceError: i is not defined

// 使用var的for循环
var a = [];
for (var i = 0; i < 10; i++) {
  a[i] = function () {
    console.log(i);
  };
}
a[6](); // 输出10, i的值在for循环块外面也是



/*****************************************
window挂载
******************************************/
var a = 'a';
console.log(a,window.a) //abc abc

let b = 'b';
console.log(b,window.b) //b undefined

const c = 123;
console.log(c,window.c) //123 undefined

总结: (1)let是块级作用域,var是全局作用域;(2)let不可重复声明同一变量,var可以;(3)var可以先使用后声明变量,let不可以。(4)var声明的变量会挂载在window上,而let和const声明的变量不会。

 

3. const 关键字

(1) const定义的变量不可以修改,而且必须初始化。

(2) const是块级作用域

 

4. async await(通常在调用接口的时候使用

async用于定义一个异步函数,该函数返回一个Promise(参考廖雪峰的教程),等同于return Promise.resolve(value);

await表示要“等待”异步操作的返回值,也可以用于同步返回值. async 定义了一个异步函数,返回值是一个Promise对象,使用await得到的是该异步函数的返回值,而不是Promise对象。

async function timeout(){
    return "happy halloween";
}

console.log(timeout());   // 返回一个Promise对象,可以通过then()方法拿到返回值

let a = await timeout();
console.log(a);           // 输出happy halloween

 

5.  * 与 yield

yield意为“生产”,function * 表示定义一个生成器函数,通过以下例子简单说明:

function* generator(i) {
  yield i;
  yield i + 10;
}

var gen = generator(10);

console.log(gen.next().value);
// expected output: 10

console.log(gen.next().value);
// expected output: 20

点击查看更多关于*与yield的说明

6.  switch

/**
*  js的switch的case只是确定代码开始执行的位置,应当在每个case后加一个break跳出switch
*  
*/
var x = 0;
switch(x){
    case 1 : console.log(1);            // x !=1 ,故不执行
    case 0 : console.log(0);            // 找到开始执行的位置,输出0
    case x=20: console.log(x);          //确定开始执行的位置之后,剩下的case条件不再执行,直接执行case后面的语句,输出  0
    default: console.log('default')     // 输出default
}

 

JS的运算符

js运算符表如下

其中值得注意的是 “==” 和 “===” 的区别

"=="的比较过程

  1. 先判断两个操作数的数据类型
  2. 不相同 类型转换 转换成相同类型进行比较

“===”是更严格的比较

  1. 先判断两个操作数的数据类型,不相同返回false
  2. 相同,进行值的比较

代码示例如下:

null == undefined // true
'1' == 1 // true
'undefined' == undefined // false, undefined会隐式转换为false,false == ‘undefined’

'1' == true // true, '1'可以隐式转换为true
'2' == true // false ,'2'可以转换成数字的2, 但不能转换为true


1 == true // true
null === undefined // false

运算符的优先级与隐式转换

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值