先是笔试,笔试主要是一些较为简单的代码解释输出。最后两道大题,第一道是要写出一个求和的函数,第二道是编写一个函数让其对输入的数组进行判断,若该数组中有两个数相加等于给定的另一个数,则将这个两个数的索引进行输出。twoSum([2,7,4,5,6],9)
面试时主要聊到了:
闭包:
1.变量作用域
要理解闭包,首先要理解变量JavaScript的特殊的变量的作用域。
变量的作用域有两种:全局变量和局部变量。
JavaScript的特别之处就在于:函数内部可以直接读取全局变量,但是函数外部无法读取函数内部的局部变量。
注意点:在函数内部声明变量的时候,一定要使用var命令。如果不用的话,你实际上声明的是一个全局变量!
2.如何从外部读取函数内部的局部变量?
那就是在函数内部,再定义一个函数。
function f1(){
var n=999;
function f2(){
alert(n); // 999
}
}
在上面的代码中,函数f2就被包括在函数f1内部,这时f1内部的所有局部变量,对f2都是可见的。但是反过来就不行,内部的局部变量,对f1就是不可见的。
这就是JavaScript语言特有的“链式作用域结构”(chain scope),子对象会一级一级地向上寻求所有父对象的变量。所以,父对象的所有变量,对子对象都是可见的,反之则不成立。既然f2可以读取f1中的局部变量,那么只要把f2作为返回值,我们就可以在f1的外部读取它的内部变量了!!!
3.闭包的概念
上面代码的f2函数,就是闭包。个人理解:闭包就是能够读取其他函数内部变量的函数。
由于在JavaScript中,只有函数内部的子函数才能读取局部变量,所以说,闭包可以简单理解成“定义在一个函数内部的函数”。所以,在本质上,闭包是将函数内部和函数外部连接起来的桥梁。
4.闭包的用途
闭包最大的用途有两个:1.可以读取函数内部的变量,2.让这些变量的值始终保持在内存中,不会再f1调用后被自动清除。
为啥会如此呢?因为f1是f2的父函数,f2被赋予了一个全局变量,所以f2始终在内存中,而f2的存在依赖于f1,因此f1也始终在内存中,不会在调用结束后,被垃圾回收机制回收。
5.使用闭包的注意点
(1)由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄漏。解决方法是,在退出函数之前,将不使用的局部变量全部删除。
(2)闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当做对象(object)使用,把闭包当做它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这是一定要小心,不要随便改变父函数内部变量的值。
数据绑定
1.数据双向绑定
(1)什么是数据双向绑定?
vue是一个mvvm框架,即数据双向绑定,即当数据发生变化的时候,视图也就发生变化,当视图发生变化的时候,数据也会跟着同步变化。值得注意的是:我们说的数据双向绑定,一定是对于UI控件来说的,非UI控件不会涉及到数据双向绑定。单向数据绑定是使用状态管理工具(如redux)的前提。如果我们使用vuex,那么数据流也是单向的,这时就会和双向数据绑定有冲突。
(2)为什么要实现数据双向绑定?
在vue中,如果使用vuex,实际上数据还是单向的,之所以说是数据双向绑定,这是用的UI控件来说,对于我们处理表单,vue的双向数据绑定用起来就特别舒服了。
即两者并不互斥,在全局性数据流使用单项,方便追踪;局部性数据流使用双向,简单易操作。
2.单向数据流
数据流,表明的是数据流向,单向数据流式我们的数据单一方向传输。对于Vue来说,组件之间的数据传递具有单向数据流这样的特性。对于父子组件来说,父组件总是通过props向子组件传递数据。所有的prop都使得其父子prop之间形成了一个单向下行绑定:父级prop的更新会向下流动到子组件中,但是反过来则不行。这样能防止子组件意外改变父组件的状态,从而导致应用的数据流向难以理解。另,每次父级组件发生更新时,子组件中所有的prop都将会刷新为最新的值。这意味着你不应该在一个子组件内部改变prop。如果你这样做了,Vue会在浏览器的控制台中发出警告。
注意在JavaScript中对象和数组是通过引用传入的,所以对于一个数组或对象类型的prop来说,在子组件中改变这个对象或数组本身将会影响到父组件的状态。
3.单向数据流与双向数据绑定的联系与区别
对于非UI控件来说,不存在双向,只有单向。只有UI控件才有双向的问题。单向绑定使得数据流也是单向的,对于复杂应用来说这是实施统一的状态管理(如Vuex)的前提。双向绑定在一些需要实时反应用户输入的场合会非常方便(比如表单提交)。但通常认为复杂应用中这种便利比不上引入状态管理带来的优势。
单向数据流和双向数据绑定有什么优缺点?
单向数据流优缺点:
优点:
(1)所有状态的改变可记录、可跟踪,源头易追溯;
(2)所有数据只有一份,组件数据只有唯一的入口和出口,使得程序更直观更容易理解,有利于应用的可维护性。
(3)一旦数据变化,就去更新页面(data-页面),但是没有(页面-data);
(4)如果用户在页面上做了变动,那么就手动收集起来(双向是自动),合并到原有的数据中。
缺点:
(1)HTML代码渲染完成,无法改变,有新数据,就必须把旧HTML代码去掉,整合新数据和模版重新渲染;
(2)代码量上升,数据流转过程变长,出现很多类似的样板代码;
(3)同时由于对应用状态独立管理的严格要求(单一的全局store),在处理局部状态较多的场景时(如用户输入交互较多的“富表单型”应用),会显得啰嗦及繁琐。
双向数据绑定的优缺点:
优点:
(1)用户在视图上的修改会自动同步到数据模型中去,数据模型中值的变化也会立刻同步到视图中去。
(2)无需进行和单向数据绑定的哪些相关操作;
(3)在表单交互较多的场景下,会简化大量业务无关的代码。
缺点:
(1)无法追踪局部状态的变化
(2)“暗箱操作”,增加了出错时debug的难度;
(3)由于组件数据变化来源入口变得可能不止一个,数据流转方向易紊乱。
原文链接地址:详解单向数据流与双向数据绑定_张印的博客-CSDN博客_单向数据流和双向数据绑定
JS中的数据类型
6 种数据类型:
- string
- number
- boolean
- object
- function
- symbol
3 种对象类型:
- Object
- Date
- Array
2 个不包含任何值的数据类型:
- null
-
undefined
python数据类型:
- Number(数字)
- String(字符串)
- List(列表)
- Tuple(元组)
- Set(集合)
- Dictionary(字典)
ES6中新增了Symbol。这种类型的对象永不相等,即使创建的时候传入相同的值,可以解决属性名冲突的问题,做为标记。
谷歌67版本中还出现了一种bigInt。是指安全存储、操作大整数。
AJAX
AJAX=异步 JavaScript和XML
AJAX是一种用于创建快速动态网页的技术。
通过在后台与服务器进行少量数据交换,AJAX可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。
传统的网页(不适用AJAX)如果需要更新内容,必须重载整个网页。