写在最前面:这是我个人学习过程中的随手记录,更多是写给自己看的,而且时间跨度比较大,内容的逻辑性、表述的准确性等等各方面还有所欠缺,希望能刷到这篇文章的小伙伴不要笑话。
有发现错误也欢迎批评指正呀~大家一起学习,一起进步!
js基础
-
关于定义内容中带引号的字符串,两种方法
- 在内容中的引号之前加 “\” 注意:!!!千万不要写成"/"
- 用单引号定义,但是要注意引号匹配问题
-
字符串更改不能只靠改变??(在js中这个叫Bracket Notation?不懂括号计法这个直译是什么意思)的第0个元素,要整个串重新定义。
(p.s. 后面有专门讲数组的,所以我并不太懂这个到底是什么东西)
-
.push() .pop() 栈思想 .shift() .unshift() 队列思想
-
js里的打印语句
console.log();
-
js 里面 == 会有强制类型转换,所以 3== ‘3’为true。从而也有=== 这个表达(strict equality operator),该表达下不做强制类型转换,只有当左右两边的数据类型也完全一致时,才有true。
-
js 的switch case语句里面的case严格执行===
-
“if your object has any non-string properties, JavaScript will automatically typecast them as strings. "js会把属性自动转换成字符串类型。(笔者直接看的英文网站,不知道”properties“这个中文直译为所有物、财产的单词在该语境下被翻译成什么,暂时理解为之前学java基础听过的”属性“一词,如果不对欢迎指出)
-
js 数组下标也是从0开始的
Math.random() js中的随机数函数
Math.floor(Math.random()*num) 可使得生成的随机数范围在0~num-1范围间
如果不想范围从0开始,就在这串代码后面加上基数
# ES6
关于let
- 在2009年颁布的ES5版本中,var关键词能够override 某一个变量,这样在大型工程项目中很容易出现隐患 。let 关键词保证了变量的独特性和唯一性,在编写者试图对变量进行override时会报错。
- 但同时,let也有一个问题,如果它是在某个block\statement\expression中被定义的,它的有效范围仅仅限于其中。var被定义后,既可作为全局变量,又可作为局部变量;但是let如果被定义成局部变量,就只能是局部变量。
- “use strict" 能对代码进行更严格规范的检查,我的理解是类似于java中的@override
关于const
- const是与let类似的一个赋值关键词,但它比let更突出的一点在于:它的值不能改变。(正如全词constant所表达的意思) 。不过,值得注意的是,在数组或者函数内,依然有办法改变const的值。我个人理解,比如用const定义了一个数组,系统将会为它分配地址,首元素的地址也是该数组的地址,它占了内存中的一块固定的区域,地址是不变的,但是单个元素的数值是可以改变的。
关于Object.freeze
- 为了更好地固定某个变量的值,使其一经定义,在任何时候都不发生改变,ES6提出了名为Object.freeze的函数。“Once the object is frozen, you can no longer add, update, or delete properties from it. Any attempt at changing the object will be rejected without an error.” 编译器不会提示你错了,但是更改语句不会生效。
关于定义一个别处再也不需要用到的函数
格式例子:const xx=
()=>{
};
注:其实只是把function() 简写为 ()-> ,想传参数依然可以往括号里放,如果只传一个参数,也允许如下写法:
const doubler = item => item * 2;
- import 一个文件中的所有内容:
import * as xxxx//自己喜欢的新名字 from './'//文件路径
- 只想export 单个文件中的单个函数:
在函数前面加个 export default
关于其中涉及到后端的知识
pend(等待) fulfilled 和rejected的思想让我联想到了之前了解到了一些进程线程锁机制等等方面的知识
.then 对应设置resolve
.catch 对应设置reject
object programming
-
prototype: 定义了父类中的固定原型属性
function Dog(name) { this.name = name; } Dog.prototype.numLegs=2; let beagle = new Dog("Snoopy");
当实例中没有该属性时,就会到参照该原型;当实例中有属性时则不影响。
-
值得注意的是,原型属性会重写覆盖构造属性,因此一定要记得声明constructor
-
"Object.create(obj) creates a new object, and sets obj as the new object's prototype."
例子:
let animal = Object.create(Animal.prototype);
个人理解:与
let animal = new Animal();
相比,当属性很多时,new Animal()比较麻烦,前者相对比较直接。
之前讲了很多关于继承的内容,感觉都理解了,就没有记笔记,接下来讲如何对两个不相关的对象添加行为联系。
- 让两个不相关的对象具有相同属性:mixin
let flyMixin = function(obj) {
obj.fly = function() {
console.log("Flying, wooosh!");
}
};
let bird = {
name: "Donald",
numLegs: 2
};
let plane = {
model: "777",
numPassengers: 524
};
flyMixin(bird);
flyMixin(plane);
鸟和飞机都拥有了fly()属性
-
私有属性
概念:closure
“In JavaScript, a function always has access to the context in which it was created. This is called
closure
.”使用方法:
function Bird() { let hatchedEgg = 10;//pay attention to the left!!! this.getHatchedEggCount = function() { return hatchedEgg; };//pay attention to the above two lines!!! } let ducky = new Bird(); ducky.getHatchedEggCount();
-
IFEE:函数没有名字,也不存储在变量中
写法:先写两个括号后加分号,第一个括号里面写function(){xxxxx}
(function(){xxxxx})();
functional programming
-
const newarr=arr;
个人理解:上述代码中的参数是是数组之类的话,相当于是newarr 与arr(指针)指向了同一块区域,因此改变newarr也会改变arr。
函数式编程的原则要求在函数中不能改变传入参数的值,如果传入的参数是一个变量,值是不会改变的;但如果传入的是数组或者是指针,则会改变。
截至目前,针对数组的情况,我想到的解决方案是:在函数中新定义一个空数组,用for挨个将原数组的元素赋值给新数组,最后对新数组进行调整并返回新数组。
也可以使用map() 返回一个新数组,再对新数组进行调整
// Only change code below this line
function urlSlug(title) {
let tmp=title.toLowerCase().split(" ");
let goal=tmp.join("-");
return goal;
}
// Only change code above this line
//regular expression needed
function curried(x) {
return function(y) {
return x + y;
}
}
假如传入的参数x=1,y=2,最终返回结果就是3,适用于以下几个方面:
(参考知乎回答:“柯里化在工程中有什么应用”
- 延迟计算
- 动态创建函数
- 参数复用