iOS面试的一些小问题

①(语法篇)、《史上最全iOS八股文面试题》2022年,金三银四我为你准备了,iOS《1000条》笔试题以及面试题(包含答案)。带面试你过关斩将,(赶紧过来背iOS八股文) iOS面试1000题以及答案-笔试题-①语法篇 阅读详情

React vs Vue

前言:

  1. 技术选型没有绝对的对与错
  2. 技术选型要考虑的因素非常多
  3. 表达自己的观点,并说明理由

两者的本质区别:

  1. vue - 本质是MVVM框架,由mvc发展而来
  2. React - 本质是前端组件化框架,由后端组件化发展而来
  3. 但两者都能实现相同的功能

模板的区别:

  1. vue - 使用模板(template)由angular提出

  2. React - 使用JSX,一种编程语法,类似于html

  3. 模板语法上更倾向于JSX:

    • vue中的指令v-需要现学,并且它们的值是放在引号中,比较困惑;
    • 而JSX中,只需要知道大括号中可以写JS表达式,就OK
  4. 模板分离上更倾向于vue

组件化的区别:

  1. React本身就是组件化,没有组件化就不是React
  2. vue也支持组件化,不过是在MVVM上的扩张
  3. 对于组件化,更倾向于React,做的更彻底

两者共同点:

  1. 支持组件化
  2. 数据驱动视图

总结:

1.国内,首推vue,文档易读、易学、社区足够大

2.团队水平高,推荐使用React,组件化和jsx

作为一个开发者,有一个学习的氛围跟一个交流圈子特别重要,这是一个我的iOS开发交流群:130595548,不管你是大牛还是小白都欢迎入驻 ,让我们一起进步,共同发展!(群内会免费提供一些群主收藏的免费学习书籍资料以及整理好的几百道面试题和答案文档!)

React

对组件化的理解

与面向对象类似,分为: 封装、继承、多态

组件的封装

  1. 视图
  2. 数据
  3. 变化逻辑(数据驱动视图变化)

分装完成后使用者不用明白组件中的视图、数据、变化逻辑,只需要提供组件需要的数据即可

组件的复用

  1. props传递(传递不同的数据,组件产生不同的效果,但模板是一样的)
  2. 复用

JSX的本质

React引入的一种编程的语法,类似于html

JSX语法

JSX语法无法被浏览器直接解析,最终需要转换成JS来运行

  1. html(普通标签)
  2. 引入JS变量和表达式
  3. if判断
  4. for循环
  5. style 和 calssName
  6. 事件绑定
JSX解析(本质)

JSX是语法糖,需被解析成JS才能运行,通过React.createElement(‘tagName’, {标签属性}, 子元素…),可以联想到vdom中的h函数(生成vnode)

  1. JSX其实是语法糖
  2. 开发环境会将JSX编译成JS代码
  3. JSX的写法大大降低了学习成本和编码工作量
JSX已经标准化
  1. JSX是React引入的,但不是React独有的
  2. JSX其它项目也可以使用
  3. React.createElement是可以自定义修改的
  4. 说明: 本身功能已完备,兼容和扩展性没问题

JSX和vdom的关系

为何需要vdom
  1. vdom是React初次推广开的,结合JSX来使用
  2. JSX就是模板(类似于vue模板),最终需要渲染成html
  3. 初次渲染+修改state后的re-render
  4. 正好符合vdom的应用场景
React.createElement() 和 h()函数

所有的JSX代码都会解析成JS代码来执行,JS代码执行时会返回vnode

何时patch
  1. 初次渲染 - ReactDOM.render(, container),会触发patch(container, vnode)
  2. re-render - setState时会触发patch(vnode, newVnode)进行对比
自定义组件的处理
  1. 'div’会直接渲染成<div>
  2. Input和List,是自定义组件class,vdom默认不认识
  3. 因此,Input和List定义时必须声明render函数
  4. 并根据props初始化实例,染回执行实例的render函数
  5. render函数返回的是一个vnode对象
return React.createElement('div', null, 
  React.createElement(Input, {addTitle: this.addTitle.bind(this)}),
  React.createElement(List, {data: this.state.list}),
  React.createElement('p', null, 'this is demo')
)
// React.createElement(List, {data: this.state.list}), 类似以下代码
const list = new List({data: this.state.list})
const vnode = list.render()
总结
  • 为何需要vdom: JSX需要渲染成html,并通过vdom数据驱动视图操作、渲染html
  • React.createElement和h函数一样,都生成vnode
  • 何时patch:ReactDOM.render()初次渲染和setState后续更新
  • 自定义组件的解析:初始化实例,然后执行render函数返回vnode

React 生命周期

Mounting 阶段

Mounting阶段叫挂载阶段,伴随着整个虚拟DOM的生成,它里面有三个生命周期函数,分别是:

  1. componentWillMount: 在组件被挂载到页面之前执行
  2. render: 页面初始化、state和props发生变化时执行
  3. componentDidMount: 组件挂载完成时被执行
componentWillMount:

此函数只在组件初始化时或页面刷新时执行一次。

render:

render()是纯函数,只返回需要渲染的东西,不应该包含其它的业务逻辑,可以返回原生DOM、React组件、Fragment、字符串、数字、Boolean和null等内容。

componentDidMount:

此函数只在组件初始化时或页面刷新时执行一次。

组件装载之后调用,此时可以获取到DOM节点并操作,比如对canvas、svg的操作,服务器请求,订阅都可以写在里面,但是记得在componentWillUnmount中取消订阅

Updation 更新阶段

Updation阶段,也是组件发生改变的更新阶段,它有两个基本部分组成,一是props属性改变,二是state状态改变

  1. shouldComponentUpdate: 在组件更新之前,自动被执行
  2. componentWillUpdate: 在函数shouldComponentUpdate返回true后执行
  3. render()
  4. componentDidUpdate: 在组件更新之后执行,它是组件更新的最后一个环节
shouldComponentUpdate:

shouldComponentUpdate(nextProps, nextState),有两个参数nextProps和nextState,表示新的属性和变化之后的state,返回一个布尔值,true表示会触发重新渲染,false表示不会触发重新渲染,默认返回true,通常利用此生命周期来优化React程序性能

render

更新阶段也会触发此函数

componentDidUpdate:

componentDidUpdate(preProps, preState, snapshot),该方法有三个参数,之前的props、state以及snapshot 组件更新之后执行,它是组件更新的最后一个环节

Unmounting 卸载阶段
  1. componentWillUnmount: 当我们的组件被卸载或销毁时就会调用
componentWillUnmount:

在组件被销毁之前可以在函数中执行,去除定时器,取消网络请求,清理无效的DOM元素等垃圾清理工作

生命周期改善程序性能
通过 shouldComponentUpdate 函数改善React组件的性能
// nextProps: 变化后的属性,nextState: 变化后的状态
shouldComponentUpdate(nextProps, nextState) {
    if(nextProps.content !== this.props.content) {
        return true
    }else {
        return false
    }
}

基础

base

  1. web标准

    • 结构: 用于结构化的web标准化技术主要由Html、Xhtml、Xml
    • 表现: 主要是CSS
    • 行为: 体现行为的标准技术主要有Dom和Javascript
  2. 主流浏览器及内核

    • Chrome - Blink
    • Safari - Webkit
    • Firefox - Gecko
    • IE - Trident
    • Opera - Blink
    • 百度、世界之窗 - IE内核
    • 360、猎豹浏览器 - IE+Chrome 双内核
    • 搜狗、QQ浏览器 - Trident(兼容模式)+Webkit(高速模式)

HTML

DOCTYPE的作用

DOCTYPE是html5标准网页声明,且必须声明在html文档的第一行<!DOCTYPE html>。作用是通知浏览器的解析器使用什么文档标准解析此文档

文档解析类型有:
  • BackCompat: 怪异模式,默认使用此模式
    • 会模拟更旧的浏览器的行为
  • CSS1Compat: 标准模式,浏览器使用W3C的标准解析渲染页面
    • 页面按照HTML和CSS的定义渲染
HTML、XHTML、XML的区别
  • HTML(超文本标记语言): 在html4.0之前HTML现有实现再有标准,导致HTML非常混乱松散
  • XML(可扩展标记语言): 主要用于存储数据和结构,可扩展,作用与JSON类似
  • XHTML(可扩展超文本标记语言): 基于上面两者而来,W3C为解决HTML混乱问题而生,基于此诞生了HTML5,开头加入<!DOCTYPE html>,就是标准模式
HTML语义化的理解

语义化是指使用恰当的html标签,让页面具有良好的结构与含义,比如<p>代表段落,<article>代表正文内容等。

语义化的好处:
  • 开发者友好: 使用语义类标签增强可读性,开发者可以清晰的看出网页结构,便于团队的开发和维护
  • 机器友好: 语义类标签,更适合搜索引擎的爬虫爬取有效的信息
  • 对于知乎、掘金此类富文本类的应用很重要,语义化对于其网站的内容传播有很大的帮助
meta标签

meta标签由name和content两个属性来定义,来描述一个HTML网页文档的属性,如作者、时间、网页描述、关键词、页面刷新等,除了http规定的一些name外,开发者也可以自定义name

  • charset:用于描述HTML文档的编码形式

    <meta charset="UTF-8" >
    
  • http-equiv:相当于http的文件头作用,如下可以设置http的缓存过期日期

    <meta http-equiv="expires" content="Wed, 20 Jun 2019 22:33:00 GMT" >
    
  • viewport:移动端中,开发人员可以控制视口的大小和比例

    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1" >
    
  • apple-mobile-web-app-status-bar-style:开发过PWA应用的开发者应该很熟悉,为了自定义评估工具栏的颜色

    <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" >
    
src和href的区别
  • src是指向外部资源的位置,指向的内容会嵌入到文档中当前标签所在的位置,在请求src资源时会将其指向的资源下载并应用到文档内,如JS脚本、img图片、frame等元素。当浏览器解析到该元素时,会暂停其它资源的下载和处理,直到该资源加载、编译、执行完毕,所以一般JS脚本会放在底部而不是头部
  • href是指向网络资源所在位置(超链接),用来建立和当前元素、文档之间的连接,当浏览器识别到它指向的文件时,就会并行下载资源,不会停止对当前文档的处理
img中srcset的作用

srcset提供了根据屏幕条件选取图片的能力

可以设计响应式图片,我们可以使用两个新的属性srcset和sizes来提供更多额外的资源图像和提示,帮助浏览器选择一个正确的资源 srcset定义了我们允许浏览器选择的图像集,以及每个图像的大小。 sizes定义了一组媒体条件(如屏幕宽度)并且指明当某些媒体条件为真时,什么样的图片尺寸为最佳选择。

有了以上属性,浏览器会:

  • 查看设备宽度

  • 检查sizes列表中那个媒体条件是第一个为真

  • 查看给与该媒体查询的槽大小

  • 加载srcset列表中引用的最接近所选的槽大小的图像

    <img 
        src="clock-demo-thumb-200.png"
        alt="clock"
        srcset="clock-demo-thumb-200.png 200w,
                clock-demo-thumb-400.png 400w"
        sizes="(min-width:600px) 200px, 50vw" />
    
script标签中defer和async的区别
  • defer: <script defer>浏览器指示脚本在文档被解析后执行,script被异步加载后并不会立即执行,而是等待文档被解析完毕后执行
  • acync: <script async>同样是异步加载,区别是脚本加载完毕后立即执行,这导致async属性下的脚本是乱序的,对于script有先后依赖关系的情况,并不适用
  • 总结: defer是异步加载,并等到文档解析完毕后才执行;async也是异步加载,并且加载完毕后立即执行,在项目中一般将script脚本放在文档最后
前端存储方式
  • cookies: 在HTML5之前本地存储的主要方式

    • 优点: 兼容性好,请求头自带cookies方便
    • 缺点: 大小只有4k容量小,每次请求都自带cookies整体浪费流量
  • localStorage: HTML5加入的以键值对(key:value)为标准的存储方式

    • 优点: 操作方便,永久性存储(5M),兼容IE8+
  • sessionStorage: 与上边类似,区别是sessionStorage当页面关闭后会被清理,与cookies和localStorage不同,不能再所有同源窗口中共享,是会话级别的存储方式

  • IndexedDB: 被正式纳入HTML5标准的数据库存储方案,是NoSQL数据库,使用键值对进行存储,可进行快速读取操作,非常适用于web场景

CSS

CSS选择器的优先级

CSS选择器的优先级是: 内联样式>ID选择器>类选择器>标签选择器

  • 内联 - 1.0.0.0
  • ID选择器 - 0.1.0.0
  • 类选择器 - 0.0.1.0
  • 标签选择器 - 0.0.0.1

同类型的选择器会相加,但没有进位

link和@import的区别
  • link属于XHTML标签,而@import是css提供的
  • 页面被加载时,link会同时被加载,而@import引用的css会等到页面加载完成后再加载
  • import只能在IE5中识别,而link是XHTML标签,无兼容问题
  • link方式的样式权重高于@import的权重
隐藏页面元素(CSS)
  • opacity: 0; 本质是将元素透明,依然占据空间且可以交互
  • visibility: hidden; 隐藏元素,占据空间,不可以交互
  • overflow: hidden; 只隐藏元素中内容溢出的部分,占据空间,不可交互
  • display: none; 将元素从文档流中去除,不占据空间也不能交互
  • z-index: -9999; 原理是将元素的层级放在最底层,被其它元素覆盖
  • transform: scale(0,0); 将元素缩放为0,占据空间,不能交互
  • transform: translate(-1000px); 将元素移到可视区域外
px/em/rem 的区别
  • px: 绝对单位,页面按精确像素展示
  • em: 相对单位,基准点为父元素字体的大小,如果自身定义了font-size按自身来计算,整个页面内的1em不是一个固定值
  • rem: 相对单位,基准点永远是html中的font-size,整个页面的1rem是一个固定值,CSS3新属性
z-index 的理解

控制设置了position属性元素的垂直叠加顺序,元素默认的值为0,通过修改z-index来控制元素图层的位置

  • …
  • 2层
  • 1层
  • 0层,默认
  • -1层
  • -2层
  • -…
层叠上下文
定义:

是HTML元素的三维概念,是一个假想的相对于电脑屏幕或网页的Z轴上的延伸,HTML元素根据其自身属性按照优先级占用层叠上下文的空间

产生:
  • z-index 的值不为auto的relative和absolute和fixed
  • opacity 属性值小于1的元素
  • transform 属性值不为none的元素
清除浮动的方法
  • 添加额外标签-clear: both;

    <div>
        // ...
        <div style="clear: both;"></div>
    </div>
    
  • 父级添加overflow属性(BFC)或设置高度

    <div style="overflow: hidden;">
        // ...
    </div>
    
  • 为类选择器清除浮动(推荐)

    .box:after {
        content: '';
        display: block;
        height: 0;
        visibility: hidden;
        clear: both;
    }
    <div class="box">
        // ...
    </div>
    
盒模型的理解

盒模型由content、padding、border、margin组成

定义:

当对一个文档进行布局时,浏览器的渲染引擎会根据标准之一的CSS基础盒模型,将所有元素表示为一个个矩形盒子(box)。CSS决定了这些盒子的大小、位置以及属性(颜色、背景、边框等)

标准盒模型与怪异盒模型的区别
标准盒模型

在W3C标准下,我们定义的width === content的宽度值,height === content的高度值,因此,元素的宽度为:

元素宽度 = margin-left+margin-right+border-left+border+right+padding-left+padding-right+width

怪异盒模型

在IE怪异盒模型(IE8以下)width !== content的宽度,而是 width === border-left+border-right+padding-left+padding-right+width

元素宽度 = margin-left+margin-right+width

更改盒模型
 box-sizing: content-box; // 标准盒模型
 box-sizing: border-box; // 怪异盒模型
BFC 的理解

块级格式上下文: 它是一块独立的区域,让处于BFC内部的元素与外部的元素互相隔离

触发条件
  • 根元素,即HTML元素
  • position: fixed/absolute;
  • float不为none
  • voerflow不为visible
  • display的值为 inline-block、table-cell、table-caption
应用场景
  • 防止浮动导致父元素高度塌陷

    <style>
     .container {
        border: 10px solid red;
        overflow: hidden;
    }
     .inner {
        float: left;
        background: #08BDEB;
        height: 100px;
        width: 100px;
    }
    </style>
    <div class="container">
        <div class="inner">
            // ...
        </div>
    </div>
    
  • 避免外边距折叠

    <style>
     .container {
        background-color: green;
        overflow: hidden;
     }
     .inner {
      background-color: lightblue;
      margin: 10px 0;
     }
     .bfc{
      overflow: hidden;
     }
    </style>
    <div class="container">
    <div class="inner">1</div>
    <div class="bfc">
      <div class="inner">2</div>
    </div>
    <div class="inner">3</div>
    </div>
    
translate和position改变元素位置的区别
  1. translate是transform的一个值,改变transform或opacity不会触发浏览器的重新布局reflow或重绘repaint
  2. 改变绝对定位会触发浏览器的重新布局,进而触发重绘
  3. transform使浏览器为元素创建一个GUP图层,但改变绝对定位会使用CPU
  4. 使用translate更高效,可以缩短拼花动画的绘制时间
伪类和伪元素的区别

伪类: 以冒号:作为前缀,被添加到一个选择器末尾的关键字,当你希望样式在特定状态下才被呈现到指定的元素时,你可以在元素的选择器后面添加对应的伪类

  • 元素:first-child {}
  • 元素:nth-child(n) {}
  • 元素:hover {}
  • 元素:focus {}
  • a:link {未访问的链接}
  • a:visited {以访问的链接}
  • a:active {选定的链接}

伪元素: 用于创建一些不在文档中的元素,并为其添加样式

  • ::before
  • ::after
区别
  • 伪类是通过在元素选择器上加入伪类改变元素的状态
  • 伪元素是通过对元素的操作来添加元素
Less

Less预处理器: 支持CSS语法,引入变量,混合,运算,嵌套等,简化CSS编写,降低维护成本

变量
  • 语法: @变量名: 值;

    @sz: 1000px;
    p {
        font-size: @sz;
        span {
            // 运算
            font-size: @sz - 2;
        }
    }
    
嵌套
.box {
    background-color: #0f0;
    ul {
       list-style: none; 
    }
}
混合(函数)
  1. 定义: #函数名(){} || .函数名(){}
  2. 调用: #函数名 || .函数名
  3. 传参、默认值
    // 1\. 定义
    #public() {
        width: 200px;
        height: 200px;
    }
    .origin() {
        width: 200px;
        height: 200px;
    }
    // 2\. 调用
    div {
        #public()
    }
    h2 {
        .public()
    }
    // 3\. 传参、默认值
    #base(@w:200px, @h:200px) {
        width: @w;
        height: @h;
    }
    div {
        #base(600px, 600px);
    }
Sass
变量
  • 语法: $blue: #1875e7;
$blue: #1875e7;
div {
    color: $blue;
}
  • 嵌套在字符串中,必须写在#{}中
$side: left;
.rounded {
    border-#{$side}-radius: 5px;
}
计算功能
body {

}

JS

JS基础

谈谈你对原型链的理解

此问题关键在于两点: 原型对象,原型链的形成

  • 原型对象

    • 大部分函数都有一个prototype属性,此属性是原型对象用来创建新对象实例,而所有被创建的对象都会共享原型对象,因此这些对象便可以访问原型对象的属性
    • 例如hasOwnProperty()方法存在于Object原型对象中,因此它便可以被任何对象当做自己的方法使用
    obj.hasOwnProperty(key)
    // 如果对象obj包含key属性则返回true否则false
    
  • 原型链

    • 原因是每个对象都有__proto__属性,此属性指向该对象的构造函数的原型
    • 对象可以通过__proto__与上游的构造函数的原型对象连接起来,而上游的原型对象也有一个__proto__,这样就形成了原型链

判断一个变量是否是数组

  • Array.isArray(arr)

    if(Array.isArray(value)) { return true }
    
  • toString(arr)

    if(!Array.isArray) {
        Array.isArray = function(args) {
            return Object.prototype.toString.call(args) === "[object Array]"
        }
    }
    

ES6模块与CommonJS模块的区别

  • ES6 Module和CommonJS模块的不同点:
  1. CommonJS是对模块的浅拷贝,ES6 Module是对模块的引用,即ES6 Module是只读的,不能改变其值,就是指针指向不能变
  2. import的接口是只读状态,不能修改其变量值。即不能修改其变量的指针指向,但可以改变变量内部指针指向;可以对CommonJS重新赋值(改变指针指向),但对ES6 Module赋值会编译报错
  • ES6 Module和CommonJS模块的共同点:
  1. CommonJS和ES6 Module都可以对引入的对象进行赋值,即对对象内部属性进行改变

async/await

async函数,就是Generator函数的语法糖,它建立在Promise上,并且与所有的基于Promise和API兼容

  1. async 声明一个异步函数
  2. 自动将常规函数转换成Promise,返回值是一个promise对象
  3. 只有async函数内部的异步操作执行完,才会执行then方法指定的回调函数
  4. async函数内部可以使用await

await暂停异步的功能执行

  1. 放置在Promise调用之前,await强制后面的代码等待,直到Promise完成并返回结果
  2. 只能与Promise一起使用,不适用于回调
  3. 只能用于async函数内部

async/await相对于Promise的优势

  • 代码类似于同步代码,Promise虽然摆脱了回调地狱,但.then的链式调用也会带来额外的阅读负担
  • Promise传递中间值非常麻烦,而async/await几乎是同步写法
  • 错误处理更友好,async/await使用try/catch,Promise使用.catch非常冗余
  • 调试更友好,在.then使用调试器后,调试器并不能进入后续的.then代码块,因为调试器只能跟踪同步代码

JavaScript 的参数传递方式

  • 基本类型传递方式

    JS中基本类型数据是按照值传递

    var a = 1
    function test(x) {
        x = 10
        console.log(x)
    }
    test(a) // 10
    console.log(a) // 1
    
  • 复杂类型按引用传递

    function test(person) {
        person.age = 26;
        person = {
            name: 'ijk',
            age: 123
        }
        return person
    }
    const p1 = {name: 'xyz', age: 20}
    const p2 = test(p1)
    console.log(p1) // {name: 'xyz', age: 26}
    console.log(p2) // {name: 'ijk', age: 123}
    
  • 按共享传递

    复杂类型之所以会产生这种特性,原因就是在传递过程中,对象p1先产生一个副本p1,这个副本p1并不是深克隆得到的副本p1,副本p1地址同样指向对象p1指向的堆内存。

    因此,在函数中修改person只是修改了副本p1,p1对象没有变化,但是如果修改了person.age = 26是修改了两者指向的统一个堆内存,此时p1也会受到影响。

    这种特性叫做传递引用或按共享传递。

BingInt 提案

  • JS中最大安全数字Number.MAX_SAFE_INTEGER === 2^56,即在此数范围内不会出现精度丢失(小数除外)。

  • 但是一旦超过此范围,JS就会出现计算不准确的情况,使得在大数计算时需要依靠第三方库进行解决,因此官方提出BinInt来解决问题。

null和undefined的区别

  • null表示为空,代表此变量没有值,一个对象可以是null,代表是空对象,而null本身不是对象,因为000开头代表是对象,而null全为零,所以将它误判为对象

  • undefined表示不存在,JS是一门动态类型语言,成员除了表示存在的值外,还有可能根本就不存在(因为是否存在只有在运行期间才知道),这就是undefined的意义所在。

类型转换的规则

转字符串

  • 任何数据和字符串相加都会先自动转换为String类型

    console.log('1'+NaN) // 1NaN
    console.log('1'+1) // 11
    console.log('1'+false, '1'+true) // 1false 1true
    console.log('1'+undefined) // 1undefined
    

转数字

  • 任何数据在做算数运算时(除了和字符串相加)或任何数据在和数字比较时,其它数据都会先自动转换为Number类型

  • 任何数据和NaN做算数运算(除了和字符串相加外),结果始终是NaN

    console.log(1-'1') // 0
    console.log(1+true) // 2
    console.log(1-'a') // NaN
    console.log(1+undefined) // NaN
    

转布尔

  • 在取反运算时,其它数据会自动转换为布尔值
  • 在分支结构或循环结构的条件判断中,其它数据会自动转换为布尔值

‘1’.toString()的调用

其实在这个语句运行的过程中做了以下几件事:

// 1\. 创建String类实例
var s = new String('1')
// 2\. 调用实例方法
s.toString()
// 3\. 执行完方法后立即销毁此实例
s = null

整个过程体现了基本包装类型的性质,而基本包装类型恰恰属于基本数据类型,包括Boolean、Number、String。

0.1+0.2 !== 0.3 ?

JS的Number类型遵循的是IEEE754标准,使用64位固定长度来表示。

0.1和0.2在转换成二进制后会进入无限循环,由于标准位数的限制,后面多余的位数会被截掉,此时就会出现精度丢失,相加后因浮点数小数位的限制而截断的二进制数字在转换为十进制就会出现精度丢失。

JS机制
变量提升

JS引擎的工作方式是,先解析代码,获取所有被声明的变量,然后再一行行的运行。这造成的结果,就是所有的变量的声明语句,都会被提升到代码的头部,这就叫做变量提升。

console.log(a) // undefined
var a = 1
function b() {
    console.log(a)
}
b() // 1

上面的代码实际的执行顺序是这样的: 第一步: 引擎将var a = 1拆解为var a = undefined和a = 1,并将var a = undefined放在最顶端,a = 1还在原位置,这样一来代码就是:

var a = undefined; // 变量提升
console.log(a) // undefined
a = 1;
function b() {
    console.log(a)
}
b() // 1

第二步: 因此JS引擎一行行从上往下执行就造成了当前的结果,这就叫变量提升。

JS的作用域链

JS属于静态作用域,即声明的作用域是根据程序正文在编译时就确定的,有时也称为此法作用域。

其本质是JS在执行过程中会创造可执行上下文,可执行上下文的词法环境中含有外部词法环境的引用,我们可以通过此引用获取外部词法环境的变量、声明等,这些引用串联起来一直指向全局的词法环境,因此形成了作用域链。

箭头函数的this

箭头函数不同于传统JS中的函数,箭头函数并没有属于自己的this,它所谓的this是捕获其所在上下文的this值作为自己的this,箭头函数不会被new调用,这个所谓的this也不会被改变。

我们可以用Babel理解一下箭头函数:

// ES6
const obj = {
    getArrow() {
        return () => {
            console.log(this === obj)
        }
    }
}

转化后

// ES5,由Babel转译
var obj = {
    getArrow: function getArrow() {
        var _this = this;
        return function() {
            console.log(_this === obj)
        }
    }
}

作为一个开发者,有一个学习的氛围跟一个交流圈子特别重要,这是一个我的iOS开发交流群:130595548,不管你是大牛还是小白都欢迎入驻 ,让我们一起进步,共同发展!(群内会免费提供一些群主收藏的免费学习书籍资料以及整理好的几百道面试题和答案文档!)

移动开发—iOS常见面试问题 前言;作为iOS开发,以下面试问题,你真的全都知道么? 1.解释快速枚举。 快速枚举是IOS编程语言特性,使您能够对集合的内容进行枚举。它还将使您的代码更快地执行您的代码,因为内部实现减少了消息发送开销,并增加了流水线的潜力。 2.解释ARC。 弧表示自动参考计数。它是一个编译器级特性,简化了对象的生命周期管理过程。ARC评估对象的生命周期需求,并自动包含编译过程中需要调用的适当方法。 3.用目标C语言解释可变类型和不变类型。 可变类型意味着您可以在需要时修改内容。但是,当一个对象被标记为不可变时,它意味着 阅读详情

相关推荐

【四旋翼】pixhawk2.4.8-地面站配置-APM固件-四旋翼从装机到试飞

因为MP版本和APM版本的适配问题,真的真的是很大一个坑。最好先走别人走过的路,走通了再去自由发挥,不然白白浪费时间。下面提供我试飞成功过的版本。下面提供任意版本固件和地面站的下载方法。

xifan的博客 3万+

iOS史上最新,最全的笔试题,命中率90%

1、#import和#include的区别,@class代表什么? @class一般用于头文件中需要声明该类的某个实例变量的时候用到,在m文件中还是需要使用#import 而#import比起#include的好处就是不会引起重复包含 2、谈谈Object-C的内存管理方式及过程? 1.当你使用new,alloc和copy方法创建一个对象时,该对象的保留计数器值为1.当你不

Bonway的博客 13万+

SAP SD 顾问面试问题 consultant interview questionnaire

以下是我个人目前面试团队 SD顾问问题的小结,希望对大家有所帮助, 也可能有回答错误的地方,希望同行不吝赐教。 也希望各位顾问们讲你们遇到的一些面试问题做个跟贴,方便大家共同进步,谢谢。   面试问题清单:  一、销售订单类型影响: 可用性检查,交货类型,输出,信贷,定价,需求,报表,合作伙伴,文本,不完整日志,交货开票,订单开票,公司间开票,统计组,屏幕顺序组,参数文件...

weixin_33825683的博客 1809

解决IOS上无法选择文件问题

问题描述: 这个问题目前只在ios系统上有发现,使用createElement创建input在ios上无法执行onchange事件,如一下代码: const input = document.createElement('input') input.setAttribute('type', 'file'); input.setAttribute('accept', 'image/*'); // 文件类型 input.setAttribute('multiple', 'multiple'); //多选 in

ML.G的博客 2286

CANape快速上手

文章帮助记录CANape学习过程。

小弱鸡的博客 1万+

ISP模块之色彩增强算法--HSV空间Saturation通道调整

色彩增强不同于彩色图像增强,图像增强的一般处理方式为直方图均衡化等,目的是为了增强图像局部以及整体对比度。而色彩增强的目的是为了使的原有的不饱和的色彩信息变得饱和、丰富起来。对应于Photoshop里面的“色相/饱和度”调节选项里面对饱和度的操作。色彩增强的过程,并不改变原有彩色图像的颜色以及亮度信息。     在我的色彩增强算法模块里面,始终只针对色彩饱和度(Saturation)信息做研究,

松间明月 1万+

iOS  笔试题【90%的选中率】_技术成长笔记_新浪博客

面试能力要求:精通iphone的UI开发,能熟练操作复杂表视图,熟练使用图层技术, 可以自定义UI控件,使用类别扩展系统控件功能; 擅长通讯技术,熟悉各种通信协议,精通xml, json, 二进制或其他形式的自定义解析,能架设服务器实现客户端与服务器的通讯以提交开发效率; 熟练掌握各种数据存储技术,如core data, sqlite, 对象序列化,文件读写操作,熟悉数据库的设计...

u010783713的专栏 852

iPhone用户必看:TrollStore巨魔商店在线安装保姆级教程(iOS 14-16.6.1适用)

本文为iOS 14至16.6.1系统的iPhone用户提供了一份详细的TrollStore(巨魔商店)在线安装教程。文章从核心原理、安装前准备讲起,逐步详解了通过Safari浏览器获取安装器、信任企业证书、部署TrollStore及关键后置配置的全过程,并附带了常见问题排错指南,帮助用户安全、高效地实现无需越狱安装第三方应用。

h0i1j2k3l的博客 2001

iOS 笔试面试题

1、为什么说OC是一门动态语言?主要体现以下三个方面: 动态类型、动态绑定、动态加载 (1) 动态类型 : 即运行时再决定对象的类型。简单说就是id类型,任何对象都可以被id指针所指,只有在运行时才能决定是什么类型。 例如 : `NSString *string = [[NSData alloc]init];` 编译时 是 NSString 类型,运行时 却是 NSData 类型 (2)

风中的劲草 1840

激光雷达点云可视化:Open3D与PCL实战

激光雷达点云可视化:Open3D与PCL实战 ,人工智能,计算机视觉,大模型,AI,该文围绕激光雷达点云可视化,介绍了Open3D与PCL的实战应用。先阐述点云基础概念、特点及可视化意义,接着讲解Open3D的简介、环境配置,以及其在点云读取、显示、颜色设置、下采样和滤波等方面的实战操作,还介绍了PCL的基础、环境配置及相关实战,包括点云读取、显示、颜色设置、下采样和滤波,同时对比了两者的易用性、功能覆盖、性能和适用场景,给出综合实战案例与常见问题解决方法,为点云可视化处理提供了全面指导。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 12万+

44位abogus补环境与纯算逆向分析

44位ab参数补环境与纯算加密流程逆向分析

吴秋霖的博客 2784

iOS面试珠玑:帮你成功应对关键iOS面试问题

通过准备面试问题的答案,并提供解决步骤、示例代码和实际案例,您可以更好地准备和应对iOS面试中的关键问题。本文将分享一些关键的iOS面试问题,并提供针对每个问题的解决步骤、示例代码和实际案例,帮助您在面试中脱颖而出,展现您的技术能力和解决问题的能力。我们的应用在某些设备上出现了卡顿和响应延迟的问题。解释MVC模式的含义,即模型(Model)、视图(View)和控制器(Controller)的分离和互动。GCD的优势在于它简化了多线程编程,开发人员只需要将任务添加到合适的队列中,而无需关心线程的创建和管理。

good7ob的博客 1260

【100%通过率】华为od机试C卷【出差 / 员工派遣】Java&Go 实现

某公司部门需要派遣员工去国外做项目。现在,代号为 x 的国家和代号为 y 的国家分别需要 cntx 名和 cnty 名员工部门每个员工有一个员工号 (1,2,3,......),工号连续,从 1开始。部长派遣员工的规则:

MISAYAONE的博客 2642

iOS面试一般性问题

原文出自:标哥的技术博客 前言面试题中有一些一般性的问题,通常是会问到的。面试iOS应聘者时,切入点很重要,不同的切入点会导致不同的结果,没有找到合适的切入点也无法对应聘者有一个全面的了解。所以下面的面试问题更多的是提供方向,没有固定的答案,而且可以根据应聘者的回应引出更多有意思深层次的讨论。 注意:以下问题的参考答案均为笔者所答,不代表正确,问题答案因人而异,请根据自己的实际情况回答,若认为不

标哥 5713

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

IOS面试问题总结

1.搞清楚touch事件的传递(事件的响应链) 2.fame,bounds,center,archropoint,alpha 3,nil,NSNULL,NULL区别 4.KVC and KVO 5.NSThread,NSOperation,GCD 6.autorelease ,ARC 和非ARC 7.xib,storyboard,手动书写代码 8.loadView,viewDidLo

pingchangtan367的专栏 4万+

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

iOS面试问题开源项目教程

iOS面试问题开源项目教程 1. 项目介绍 项目概述 ios-interview-questions 是一个开源项目,旨在帮助iOS开发者准备面试。该项目收集了大量iOS面试中常见的问题和答案,涵盖了从基础到高级的各个方面。通过学习这些问题和答案,开发者可以更好地理解iOS开发的核心概念,提升面试准备的效果。 项目目标 提供全面的iOS面试问题和答案,帮助开发者系统地准备面试。 促进iOS开发者...

gitblog_00835的博客 1173

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

ios面试问题_iOS面试问答

ios 面试问题Here are 40+ commonly asked IOS interview questions and answers which will definitely help you out in interviews. 这里有40多个IOS面试常见问题和答案,它们肯定会在面试中为您提供帮助。 1. Enlist the Latest IOS Development Pa...

culing2941的博客 752

iOS开发面试时,常问的72个问题列表

前言 面试 iOS 开发时,切入点很重要,不同的切入点会导致不同的结果,没有找到合适的切入点也无法对应聘者有一个全面的了解。所以这份面试问题列表更多的是提供方向,没有固定的答案,而且可以根据应聘者的回应引出更多有意思深层次的讨论。 一般性问题 最近这两天你有学到什么知识/技能么? 最近有做过比较酷或者比较有挑战的项目么? 最近看过的书/文章有哪些? 如何向一个只接触过互联网的孩子解释「电视」? 为什么要学习编程,编程对你而言的乐趣在哪儿? 如果一个函数10次中有7次正确,3次错误,问题可能出现在哪里? 自

D_猿员的博客 622

iOS程序员面试,绝对会遇到这些问题!

常见问题 你昨天/这周学习了什么? 你为什么热衷于软件开发? 你对哪一种控制系统比较熟悉? 是否参与过GitHub项目? 是否参与过GitHub或其他同类型网站的iOS开源项目? 请描述一下你的iOS应用开发流程。 是否熟知CocoaPods?它是什么?如何运行的? 请概括一下你对软件授权的理解,及其对软件开发的影响。 请概括一下你在构建iOS应用时的测试过程。iOS应用如何实现对其他语言、日期...

weixin_34332905的博客 178

IOS面试考察(十八):逆向,汇编相关问题

文章目录IOS面试考察(十八):逆向,汇编相关问题 IOS面试考察(十八):逆向,汇编相关问题

kyl282889543的博客 596

IOS面试考察(十四):组件化问题

文章目录IOS面试考察(十四):组件化问题 IOS面试考察(十四):组件化问题

kyl282889543的博客 848

IOS面试考察(八):音视频相关问题

文章目录IOS面试考察(八):音视频相关问题 IOS面试考察(八):音视频相关问题

kyl282889543的博客 3990

IOS面试考察(十五):算法相关问题

文章目录IOS面试考察(十五):算法相关问题 IOS面试考察(十五):算法相关问题

kyl282889543的博客 241

iOS_面试遇到的问题

学习东西的方式有很多种, 面试也是一种车缺补漏的方式, 所以, 把遇到的问题总结一下, 感觉考底层实现的多一些: 1.lable 怎么从左上角开始显示内容? 答:好像drawAtPoint:可以实现 这里是唐巧关于文字置顶的详细描述,点击打开链接 2.view 上怎么显示文字 答:查了一下, 好像CATextlaye能够实现 CATextLayer *lary = [CATex

fen9fe1的博客 467

ios 平时自己面试遇到的一些问题

记录一下平时看到过的面试题,后面遇到好的再添加一 属性的实质是什么?属性默认的关键字都有哪些?atomic和nonatomic区别?@dynamic关键字和@synthesize关键字是用来做什么的?   1 @property = ivar + getter + setter;@property 系统会自动生成setter和getter方法;   2 readwrite(读写),readonly...

qq_34926035的博客 566
上一篇: iOS面试基础
下一篇: iOS经典面试题
iOS大鑫
博客等级 码龄6年 69粉丝 87原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值