深入js系列-语法
语法
语句和表达式
我们用英语的术语来说明它们的区别
“句子”(sentence)是完整表达某个意思的一组词,由一个或多个“短语”(phrase)组成,它们之间由标点符号或连接词(and 和or 等)连接起来。短语可以由更小的短语组成。有些短语是不完整的,不能独立表达意思;有些短语则相对完整,并且能够独立表达某个意思。这些规则就是英语的语法。
JavaScript 的语法也是如此。语句相当于句子,表达式相当于短语,运算符则相当于标点
符号和连接词。
语句的结果值
获得结果值最直接的方法是在浏览器开发控制台中输入语句,默认情况下控制台会显示所执行的最后一条语句的结果值。
操作

这里var规范规定返回值未undefined
之所以关注表达式,我们希望可以将语句当成表达式来处理,从而不需要将语句封装到函数再用return返回值,我们怎么在代码环境中获取表达式的返回值呢
var b;
if (true) {
b = 4 + 38;
}
// 控制台和REPL中会输出42
代码块的结果就类似隐式返回,但是我们无法直接显式获取,比如这样
var a, b;
a = if (true) {
b = 4 + 38;
};
我们可以用eval(),虽然不是个好方法,但是确实管用
var a, b;
a = eval( "if (true) { b = 4 + 38; }" );
a; // 42
目前ES7有规范,目前暂未实现
var a, b;
a = do {
if (true) {
b = 4 + 38;
}
};
a; // 42
上下文规则
1.大括号
// 对象常量
var a = {
foo: bar()
}
// 标签 在很多语言中goto语法被设计成break 和 continue 结合标签进行类似goto的操作
{
foo: bar()
}
2.代码块 左边的{}会被解析为代码块
[] + {}; // "[object Object]"
{} + []; // 0
3.对象解构
function getData() {
// ..
return {
a: 42,
b: "foo"
};
}
var { a, b } = getData();
console.log( a, b ); // 42 "foo"
自动分号(ASI)
只在换行符处添加
ASI的陷阱
function foo(a) {
return a * 2
+ 3 / 12
}
// 等同于
function foo(a) {
return a * 2;
+ 3 / 12
}
// 解决方案
function foo(a) {
return a * 2
+ 3 / 12;
}
function foo(a) {
return (a * 2
+ 3 / 12);
}
return 返回值跨行时,需要用()包起来,或者最后一行加上;
完全依赖ASI进行编码,会出现一些意料之外的陷阱
let d
let a = {
c: 3
}
({c:d} = a)
这里只为了解构a中的c,d变量已经被声明,我们不能按照常规的解构赋值,{ c:d } = a 可以将a中的c解构给d,但是这是不合法的语法,{ c:d } 被认为是代码块,= a被认为是非法的,必须使用()来考虑js引擎这是一个语句,然而这会报错,因为{}()被认为是运行前面的对象
处理这些陷阱的办法,就是依赖ASI编码时,在() []前面加一个分号来隔断
let d
let a = {
c: 3
}
;({c:d} = a)
深入js系列-语法的更多相关文章
- Vue.js系列之三模板语法
Vue.js 使用了基于 HTML 的模板语法,允许开发者声明式地将 DOM 绑定至底层 Vue 实例的数据.所有 Vue.js 的模板都是合法的 HTML ,所以能被遵循规范的浏览器和 HTML 解 ...
- Node.js系列-http
前言: 最近一直忙着公司项目的事,战友们的留言也没空回复,博客也有段时间没有更新了,年底了就是一个的忙啊~~~(ps:同感的也给个赞吧) 现在前端的就是一直地更新一直有新的东西出来,什么ES2015, ...
- JS高级语法与JS选择器
元素(element)和节点(node) childNode属性和children属性的区别 <!DOCTYPE html> <html lang="en"> ...
- Ember.js系列文章
JS前端框架之Ember.js系列文章 本文为文章索引,主要是罗列Ember.js的相关文章便于阅读. 相关演示代码:github for free. 基础篇 1. EmberJs之What|Why| ...
- 【D3.V3.js系列教程】--(十四)有路径的文字
[D3.V3.js系列教程]--(十四)有路径的文字 1. 在 svg 中插入一個 text // 在 body 中插入一個 svg var svg = d3.select('body').appen ...
- 【D3.V3.js系列教程】--(十五)SVG基本图形绘制
[D3.V3.js系列教程]--(十五)SVG基本图形绘制 1.path <!DOCTYPE html> <html> <head> <meta charse ...
- 【D3.V3.js系列教程】--(十二)坐标尺度
[D3.V3.js系列教程]--(十二)坐标尺度 1.多种类型的缩放尺度 Quantitative Scales Linear Scales Identity Scales Power Scales ...
- ExtJs4 笔记(2) ExtJs对js基本语法扩展支持
本篇主要介绍一下ExtJs对JS基本语法的扩展支持,包括动态加载.类的封装等. 一.动态引用加载 ExtJs有庞大的类型库,很多类可能在当前的页面根本不会用到,我们可以引入动态加载的概念来即用即取.这 ...
- node.js系列笔记之node.js初识《一》
node.js系列笔记之node.js初识<一> 一:环境说明 1.1 Linux系统CentOS 5.8 1.2 nodejs v0.10.15 1.3 nodejs源码下载地址 htt ...
随机推荐
- Deep Learning专栏--强化学习之从 Policy Gradient 到 A3C(3)
在之前的强化学习文章里,我们讲到了经典的MDP模型来描述强化学习,其解法包括value iteration和policy iteration,这类经典解法基于已知的转移概率矩阵P,而在实际应用中,我们 ...
- WPF DataGird 类似Excel筛选效果 未成品
这个本是针对MSDN上所写的代码,不过写一半不想写了. 不想浪费代码,是个半成品的半成品. 效果图: 思路: 利用PopUp来做显示层. 显示层中的数据则是绑定到Datagrid的数据. popup中 ...
- 修改Linux桌面高分屏下QT程序界面的缩放
问题 Linux下的高分屏在Gnome.KDE中有缩放因子一说,但是对QT程序(常用如 WPS.网易云音乐等)无效,这里只是简记修改QT程序的缩放方法 解决 su #切换root用户 cp /etc/ ...
- 【VS2019】Web项目发布时提示无法连接FTP服务器
使用 Visual Studio 2019 时出现的问题 环境:win10 ltsc 场景 发布Web项目到FTP时 失败,并提示 _无法打开网站"ftp://...".未安装与 ...
- tf.Session()函数的参数应用(tensorflow中使用tf.ConfigProto()配置Session运行参数&&GPU设备指定)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/dcrmg/article/details ...
- python机器学习---线性回归案例和KNN机器学习案例
散点图和KNN预测 一丶案例引入 # 城市气候与海洋的关系研究 # 导包 import numpy as np import pandas as pd from pandas import Serie ...
- java request.getInputStream中文乱码解决方案
请求时要指定为UTF-8,中文码码完美解决 /** * * 得到请求body字符串,一般用于content-type:application/json * */ public static Strin ...
- vue中的---MVVM(面试必问)
M---Model (数据) V---View (视图) VM---VIewModel (转换器) VIewModel主要做两件事: 1.把 Model 中的数据绑定到View(视图层). 2.监 ...
- Mysql 主从报错:1141
主从同步,从库报错代码:1141 ,错误信息如下: Master_Port: 3306 Connect_Retry: 60 Master_Log_File: binlog.000086 Read_Ma ...
- MySQL 错误代码:2003 idea错误:ERROR DruidDataSource:1846 - create connection error
idea项目一启动就报错: 20:01:13,047 ERROR DruidDataSource:1846 - create connection error com.mysql.jdbc.excep ...