面向太阳吧,不问春暖花开,只求快乐面对
唯我心语
这篇文章开场可能有点长,内容可能有些短,你就当毒鸡汤吧。
或许某个深夜,你会因为某件事激动地睡不着觉,可你永远不愿想的是,世上还有那么多像狼一样活着的人。狼是怎样一种 可怕 的生物,大家都知道的,一切都是为了生存。人的本性:懒惰、贪婪、自私...,这些都是人性的弱点,人们努力的活着,何尝不是在克服这些 弱点 。你想成功,必须要学会克服,必须比别人努力。
以前的我,抵触 基础 ,一直不懂为什么那么多面试官面试时喜欢问那么基础的东西(所谓的面试造火箭),工作又不用,何必为难人。我一如既往的学习最新的框架,对一切的新技术都很好奇,都想拿来用用。我去翻阅官方文档学习,不懂作者为什么要这么写,就去百度,发现都是基础的问题,当然我也没在意,再到后来,一次深圳之旅,彻底的改变了我,在那里我体会到了来自大都市的压力,最重要的是我收获到了这样一句话:一个有思想的人远比一个工具的使用者强大万倍。
何为 工具 ?框架就是工具,它是别人思想的结晶,它涵盖了对大多数常见问题的解决方案,你依赖它进行快速的开发,对于问题背后的解决方案,你不去思考,你没有自己的思考过程,这就叫没有 思想 ,我们需要透过现象去看本质,当然说的有些远了,前些天的一篇文章直戳要害,文章指明程序员开始的那几年是需要不断地累积技术,但发展后期最重要的还是思想。
什么算得上是 技术 ?你告我你会这框架会那框架,这就是你累积的技术,完了我问你个最基础的问题,你说你不会,对不起,你眼中的技术都不能算是技术,你只能算是上面所讲的一个熟练的工具使用者,真正的技术是以基础为支撑,在对问题经过自己思考后,沉淀下来的东西。当然以前的我也是一个工具的使用者,但以后不会再是了。
现在的我,更喜欢钻研 基础 ,如果你懂得基础的重要性,我想你也会的。现在我们要做的事就是先把基础巩固好,让自己对于这门语言有一个新的认识,认识到它的利弊端,让自己知晓它擅长处理什么,又有哪些方面是它的短板,我们才能更好的掌握它。学习最重要的的还是静心,静下心来,让我们把基础打好了。
这里我先给自己定个高级前端工程师的小目标,然后再去努力吧。
插一句,JS真的可以造火箭🚀🚀点我,相信你对它又多了一分兴趣吧,我们还是搞基础吧。加油,干!!!
什么是语法?
语法,想必谁都不会陌生,初高中的英语语法可是烦死了人。这里JavaScript 语法定义了词法规则(
如运算符和关键词等)是如何构成可运行的程序代码的。类比英语语法,它确是一个值得注意的地方,不要忽略了它。
语句和表达式
- 语句:定义了
ECMAScript中的主要语法,语句通常使用一或多个关键字来完成给定任务。语句可以很简单,例如通知函数退出;也可以比较复杂,例如指定重复执行某个命令的次数。- 表达式:由常量、变量、函数、运算符及圆括号组成的有意义的式子。通常可将变量看作表达式的特例。
简单来讲,表达式是可以被求值的代码,而语句是一段可执行代码。
以var a = 1 + 2;来讲,这是一个包含表达式的语句。var a = 1 + 2;称为"声明语句",1 + 2是一个表达式(求值为3),a = 1 + 2称为"赋值表达式"。
语句的结果值
很多人不知道,语句都有一个结果值。获得结果值最直接的方法是在浏览器开发控制台中输入语句,默认情况下控制台会显示所执行的最后一条语句的结果值。
注意: 规范定义 var 的结果值是
undefined,赋值表达式的结果值是将要赋给的值。
为什么要获得语句的结果值?
比如代码块 { .. } 的结果值是其最后一个语句 / 表达式的语法结果。
var b;
if (true) {
b = 4 + 38;
}
这段代码的结果值为 42,这个结果值如同一个隐式的返回。既然有返回值,那你可能会想到,像下面这样的写法:
var a, b;
a = if (true) {
b = 4 + 38;
};
当然目前语法不允许我们获得语句的结果值并将其赋值给另一个变量,不过这是一种思想。
ES7 规范有一项do 表达式提案,类似下面这样:
var a, b;
a = do {
if (true) {
b = 4 + 38;
}
};
a; // 42
其目的是将语句当作表达式来处理(语句中可以包含其他语句),从而不需要将语句封装为函数再调用 return 来返回值。
目前想要获得语句的结果值,可以使用eval(),当然这并不是个好办法,因为eval()会欺骗词法(在运行期修改书写期的词法作用域,with也是),我们还是要慎用eval()。
表达式的副作用
什么是副作用?
var obj = {
a: 42
};
obj.a; // 42
delete obj.a; // true
obj.a; // undefined
如果操作成功,delete 返回 true,否则返回 false。其副作用是属性被从对象中删除(或
者单元从 array 中删除)。
再看一个例子:
var a = 42;
var b = a++;
a; // 43
b; // 42
这里a++的副作用(将 a 递增)产生在表达式返回结果值之后。这里可以使用逗号运算符将多个独立的表达式语句串联成一个语句:
var a = 42, b;
b = ( a++, a );
a; // 43
b; // 43
解惑: 使用逗号操作符可以在一条语句中执行多个操作。逗号操作符多用于声明多个变量;但除此之外,逗号操作符还可以用于赋值。在用于赋值时,逗号操作符总会返回表达式中的最后一项,如下:
var num = (5, 1, 4, 8, 0); // num 的值为 0
注意: 多个赋值语句串联时(链式赋值),赋值表达式(和语句)的结果值就能派上用场,
var a, b, c;
a = b = c = 42;
// c = 42 的结果值为 42(副作用是将 c 赋值 42),然后 b = 42 的结果值为 42(副作用是将 b 赋值 42),最后是 a = 42(副作用是将 a 赋值 42)。
不要写var a = b = c = 42;,严格模式不会在找不到变量的情况下,在全局创建变量,因为严格模式下全局对象是undefined。(你可以再想下之前篇章的[[Get]]机制)
上下文规则
标签
使用 label 语句可以在代码中添加标签,以便将来使用。
start: for (var i=0; i < count; i++) {
alert(i);
}
一般多用于双层for循环,可以很方便的跳出循环。
重点: 标签也能用于非循环代码块,但只有 break 才可以。我们可以对带标签的代码块使用break,但是不能对带标签的非循环代码块使用 continue,也不能对不带标签的代码块使用 break。
代码块
[] + {}; // "[object Object]"
{} + []; // 0
第二行代码前面的{}解析为代码块,如果加上(),即({} + []),结果与第一行代码相同。
else if 和可选代码块
重点: JavaScript 并没有 else if,它是因为 if 和 else 只包含单条语句的时候可以省略代码块的{ },使你形成了误解。
解惑: if(true) console.log(1); else console.log(2); 这种省略{ }的写法你一定见过,其实else if的本质就是省略了{ },看看下面,更好理解:
if (a) {
// ..
}
else {
if (b) {
// ..
}
else {
// ..
}
}
运算符优先级
列举常见的:
*、/ > +、- > in、instanceof > == > && > || > ? : > = > ,
&&与||执行左关联,? :执行右关联,即a ? b : c ? d : e;等同于a ? b : (c ? d : e)
try..finally
finally 中的代码总是会在 try 之后执行,如果有 catch 的话则在 catch 之后执行。也可以
将 finally 中的代码看作一个回调函数,即无论出现什么情况最后一定会被调用。
举个不常见的 🌰:
function fun() {
try {
return 1;
}
finally {
return "Hello";
}
}
fun(); // "Hello"
解惑: 这里执行顺序并没有错,还是try先执行。这里return 1先执行,将函数的返回值设置为1,接着执行 finally,又将函数的返回值设置为Hello,函数执行完毕。
switch
switch (a) {
case b:
// 执行一些代码
break;
default:
// 执行缺省代码
}
a与b执行严格相等===。
了解一下: 一个不太为人所知的事实是:由于浏览器演进的历史遗留问题,在创建带有 id 属性
的 DOM 元素时也会创建同名的全局变量。
加深下印象:
<div id="foo"></div>
<!----------------------------->
if (typeof foo == "undefined") {
foo = 42; // 永远也不会运行
}
console.log( foo ); // HTML元素
