你不知道的javaScript笔记(6)
语法
语句表达式
句子是完整表达某个意思的一组词,由一个或多个短语组成,他们之间由标点符号或者连接词连接起来。
语句相当于句子,表达式相当于短语,运算符则相当于标点符号和连接词。
JavaScript 中表达式可以返回一个结果值。
var a = 3 * 6;
var b = a;
b;
var a = 3 * 6; var b = a; 声明语句,因为它声明了语句
a = 3 * 6; b = a; 表达式语句
语句的结果值
表达式的副作用
var a = 42;
var b = a++;
a; // 43
b; // 42
a++ 首先返回变量 a 的当前值 42 (在将值赋给b),然后将 a 的值加 1;
++ 在前面时,如++a, 它的副作用将(a递增)产生在表达式返回结果之前而 a++ 的副作用则产生在之后。
++a++ 会产生 ReferenceError错误
var a = 42;
var b = (a++);
a; // 43
b; // 42
可以使用语句系列运算符将多个独立的表达式语句串联成一个语句:
var a = 42,b;
b = (a++,a)
a; // 43
b; // 43
delete 运算符用来删除对象中属性和数组中的元素。
var obj = {
a:42
};
obj.a; // 42
delete obj.a; // true
obj.a; // undefined
function vowels(str){
var matches;
if(str) {
// 提取所有元音字母
matches = str.match(/[aeiou]/g);
if(matches) {
return matches;
}
}
}
vowels("Hello World"); // ["e","o","o"]
利用赋值语句的副作用将两个if 语句合二为一
function vomels (str){
var matches;
// 提取所有元素字母
if(str && (matches = str.match(/[aeiou]/g))){
return matches;
}
}
vowels("Hello World"); // ["e","o","o"]
上下文规则
1.大括号
对象常量
// 假定 函数 bar() 已经定义
var a = {
foo: bar()
}
标签
// 假定 函数 bar() 已经定义
{
foo: bar()
}
代码块
[] + {}; // "[object Object]"
{} + []; // 0
对象解构
function getData() {
// ..
return {
a: 42,
b: "foo"
};
}
var { a , b } = getData();
console.log(a,b); // 42 "foo"
{...} 还可以用作函数命名参数的对象解构,方便隐式地对象属性赋值。
function foo({a,b,c}){
// 不在需要这样:
// var a = obj.a, b = obj.b, c = obj.c
console.log(a,b,c)
}
foo({
c: [1,2,3],
a: 42,
b:"foo"
}); // 42 "foo" [1,2,3]
运算符优先级
var a = 42;
var b = "foo";
a && b; // "foo"
a || b; // 42
短路
对于 && 和 || 来说,如果从左边的操作数能够得出结果,就可以忽略右边的操作数,我们将这种现象称为短路。
a && b || c ? c || b ? a : c && b : a
因为 && 运算符的优先级高于 ||, 而 || 的优先级又高于 ? :。
(a && b || c) ? (c || b) ? a : (c && b) : a
关联
运算符的关联不是从左到右就是从右到左,这取决于组合是从左开始还是从右开始。
var a = foo() && bar();
先执行 foo() 遵循从左到右的执行循序
var a , b , c;
a = b = c = 42;
实际上是这样处理的 a = (b = ( c = 42))
var a = 42;
var b = "foo";
var c = false;
var d = a && b || c ? c || b ? a : c && b : a;
d; // 42
((a && b) || c) ? ((c || b) ? a : (c && b)) : a
现在来逐一执行
1.(a && b) 结果为 “foo”.
2."foo" || c 结果为 “foo”.
3,第一个 ? 中 “foo” 为真。
4.(c || b) 结果为 "foo".
5.第二个 ? 中, “foo” 为真值。
6.a 的值为 42
错误
在编译阶段发生错误叫做早期错误,语法错误是早期错误的一种,使用 try..catch来捕获
语法错误浏览器一般报 SyntaxError
提前使用变量
暂时性死区 TDZ
let 作用域块
{
a = 2; // ReferenceError
let a;
}
函数参数
function foo(a = 42, b = a + 1 ){
console.log(a,b)
}
foo(); // 42 43
foo(undefined); // 42 43
foo(5); // 5 6
foo(void 0, 7); // 42 7
foo(null ) // null 1
try.. finally
finally中的代码总会在try 之后执行,如果有catch 的话则在catch 之后执行。
可以将finally 中的代码看做一个回调函数,总是在最后一个执行。
switch
可以把它看做 if..else if.. else 的简化版。
switch (a) {
case 2:
// 执行一些代码
back;
case 42:
// 执行一些代码
back;
default:
// 执行一些代码
}
混合环境 JavaScript
动态创建script,标签,将其加入到页面的DOM 中。
var greeting = "Hello World";
var el = document.createElement("script");
el.text = "function foo(){ alert(greeting); setTimeout(foo,1000)}";
document.body.appendChild(el);
如果将el.src 的值设置为 URL,就可通过<script src="">
保留字:
保留字不能将它用作变量名: 保留字有四类:
“关键字” “预留关键字” “null 常量” “true/false”
你不知道的javaScript笔记(6)的更多相关文章
- 你不知道的JavaScript笔记----对象
对象: 1.定义对象属性 属性描述符(也称为:数据描述符) Object.defineProperty(Object,PropertyName,{ value: 6, writable: true, ...
- 你不知道的javaScript笔记(7)
异步:现在与将来 分块的程序 可以把JavaScript 程序写在单独的js 文件中,这个程序是由多个块组成的,这些块 中只有一个是现在执行,其余在捡来执行,最常见的块单位是函数. 例如: funct ...
- 你不知道的javaScript笔记(5)
原生函数 常用的原生函数 String() Number() Boolean() Array() Object() Function() RegExp() Date() Error() Symbol( ...
- 你不知道的javaScript笔记(4)
类型: JavaScript 有7种内置类型 空值 (null) 未定义(undefined) 布尔值(boolean) 数字(number) 字符串(string) 对象(object) 符号(sy ...
- 你不知道的javaScript笔记(3)
对象 对象可以通过两种形式定义: 声明形式和构造形式 声明形式语法: var myObj = {key:value} 构造形式语法: var myObj = new Object(); myObj.k ...
- 你不知道的javaScript笔记(2)
this和对象原型 this是一个很特别的关键字,被自动定义在所有函数的作用域中 // foo.count 是0,字面理解是错误的 function foo(num) { console.log(&q ...
- 你不知道的javaScript笔记(1)
规避冲突 function foo(){ function bar(a){ i = 3; console.log(a + i); } for ( var i=0; i < 10; i++){ b ...
- 你不知道的Javascript(上卷)读书笔记之一 ---- 作用域
你不知道的Javascript(上卷)这本书在我看来是一本还不错的书籍,这本书用比较简洁的语言来描述Js的那些"坑",在这里写一些博客记录一下笔记以便消化吸收. 1 编译原理 在此 ...
- 你不知道的JavaScript上卷笔记
你不知道的JavaScript上卷笔记 前言 You don't know JavaScript是github上一个系列文章 初看到这一标题的时候,感觉怎么老外也搞标题党,用这种冲突性比较强的题目 ...
随机推荐
- django细节
1.处理请求 1.1 /add/?a=4&b=5 这样GET方法进行[获取参数] from django.shortcuts import render from django.http i ...
- Linux配置JDK1.8环境变量
每次感觉配这个都很简单,但每次都要查一下,毕竟配错一点 后面都比较麻烦,记录一下,方便以后查看. linux 下安装jdk和windows下的安装是一样的,之前在windows安装的时候是先下载压缩 ...
- Django之(URL)路由系统
路由系统 简而言之,django的路由系统作用就是使views里面处理数据的函数与请求的url建立映射关系.使请求到来之后,根据urls.py里的关系条目,去查找到与请求对应的处理方法,从而返回给客户 ...
- iDempiere 使用指南 windows下eclipse开发环境配置及打包下载
Created by 蓝色布鲁斯,QQ32876341,blog http://www.cnblogs.com/zzyan/ iDempiere官方中文wiki主页 http://wiki.idemp ...
- Linux中怎么从root用户切换到普通用户
su是在用户间切换,可以是从普通用户切换到root用户, test@ubuntu:~$ su Password: root@ubuntu:/home/test# 也可以是从root用户切换到普通用户 ...
- win环境下jdk7与jdk8共存问题
1.jdk安装包 安装步骤略 2.jdk等配置文件修改 在安装JDK1.8时(本机先安装jdk1.7再安装的jdk1.8),会将java.exe.javaw.exe.javaws.exe三个文件cop ...
- Windows资源管理器对物理内存的描述
对每个进程的虚拟/物理内存使用描述: 1.硬错误/秒:在最后一分钟内每秒出现的平均硬页错误数 2.提交(KB):操作系统为内存保留的虚拟内存量,任务管理器中显示为:提交大小 3.工作集(KB):进程当 ...
- spring对数据库的操作、spring中事务管理的介绍与操作
jdbcTemplate的入门 创建maven工程 此处省略 导入依赖 <!-- https://mvnrepository.com/artifact/org.springframework/s ...
- Oracle里删除重复记录,保留一项
我们在使用数据库的时候,有时数据会有所重复,当我们只需要一项数据时,不需要显示重复的记录时 如下就有SQL代码: --查找表中多余的重复记录,重复记录是根据单个字段来判断 select * from ...
- WCF 的优势和特点
版权声明:本文为博主原创文章,未经博主允许不得转载. 一.理解面向服务(Service-Oriented-Architecture) 是指为了解决在Internet环境下业务集成的需要,通过连接 ...