JS基础-面向对象的程序设计
第 6 章 面向对象的程序设计6.1 理解对象
对象的定义:无序属性的集合,其属性可以包含基本值、对象或者函数。
一组键值对,其中值可以是数据或函数
6.1.1 对象的属性 包含两种:数据属性 和 访问器属性
1.数据属性
configurable 可配置性(限制 delete 删除属性和Object.defineProperty()方法是否起效。),默认 true
enumerable 可列举性,默认 true
writable 可写性,默认 true
value 值,默认 undefined
使用Object.defineProperty()方法修改这些默认属性。接收三个值:属性所在的对象、属性名、描述符对象。
123456789var person = {};Object.defineProperty(person, "name", { writable: false, value: "xu",});console.log(person.name); // xuperson.name = ...
JS基础-变量、作用域和内存问题
第 4 章 变量、作用域和内存问题
变量包含两种类型的值:
基本类型值,指的是简单的数据段
引用类型值,指的是那些可能由多个值构成的对象
复制变量值
复制基本类型的变量值只是复制了该值的副本
复制引用类型的变量值时,同样也会将存储在变量对象的值复制一份放到新变量的空间中,不同的是,这个值的副本实际上是一个指针,而这个指针指向存储在堆中的一个对象。两个变量指向同一个对象。
传递参数
所有函数的参数都是按值传递的
检测类型
typeof 检测基础类型
instanceof检测引用类型
变量 instanceof 构造函数(例:obj instanceof Object)
所有引用类型的值都是 Object 的实例
执行环境
在浏览器中,全局执行环境是window对象
每个函数都有自己的执行环境
作用域链
当代码在一个环境中执行时,会创建变量对象的一个作用域链
作用域链的前端,始终是当前执行的代码所在环境的变量对象。
作用域链中的下一个变量对象来自包含(外部)环境,而再下一个变量对象则来自下一个包含对象。这样一直延续到全局执行环境。
全局执行环境的变量对象 ...
JS基础-简介
第 1 章 JavaScript 简介
JavaScript 诞生于1995年
一个完整的 JavaScript 由这三部分组成:
ECMAScript (核心)
DOM (文档对象模型)
BOM (浏览器对象模型)
ECMAScript 的 宿主环境 包含 :
浏览器
Node
flash
ECMAScript 大致规定了下列组成部分:
语法
类型
语句
关键字
保留字
操作符
对象
第 2 章 在 HTML 中使用 JavaScript
<script> 标签有下列常见属性:
async 表示立即下载脚本,不妨碍页面的其他操作(异步下载)
无法保证每个 js 的顺序
用于互不依赖的 js
主要目的是不让页面等 js
defer 延迟到文档完全解析和显示之后在执行
在</html>标签之后执行
src 外部文件链接
type 表示编写代码使用的脚本语言的内容类型
text/javascript
第 3 章 基本概念
语法,借鉴了 C 语言
区分大小写
标识符,指的是变量、函数、属性的名字
第一个字符必须是 字母、下划线 ...
JS基础-概念
一、JS 的一些名词概念什么是作用域?变量存在的范围。
可分为全局作用域和函数作用域,ES6 新增块级作用域。
什么是闭包?闭包就是能够读取其他函数内部变量的函数。
闭包的形式:函数内部定义函数
本质上闭包就是将函数内部和外部连接起来的一座桥梁
闭包的作用:
可以读取函数内部变量
让这些变量始终保持在内存中,即闭包可以使得它诞生的环境一直存在。
封装对象的私有属性和私有方法
什么是构造函数?用于构造(生成)实例的一个函数,使实例拥有构造函数内定于的属性和方法。
什么是实例对象?实例对象就是通过 new 构造函数生成的,拥有构造函数内定于的属性和方法的一个对象。
什么是 this?就是属性或方法当前所在的对象,指向当前运行环境(对象)
什么是原型?每个函数都有一个 prototype 属性,指向一个对象,该对象称为原型对象。
什么是原型链?所有对象都有自己的原型对象,由于原型对象也是对象,因此它也有自己的原型,这就会形成一个原型链。
最顶层的原型是 Object.prototype。
读取对象属性时,JS 会先在对象自身上找,找到就直接返回,如果找不到,会到原型上找,如果还是找 ...
找出字符串中第一个匹配项的下标
找出字符串中第一个匹配项的下标
给两个字符串 haystack 和 needle ,在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回 -1 。
输入:haystack = “sadbutsad”, needle = “sad”
输出:0
解释:”sad” 在下标 0 和 6 处匹配。第一个匹配项的下标是 0 ,所以返回 0 。
123456789101112131415161718192021222324252627let strStr = function(haystack, needle) { if(!needle) return 0; if(needle.length>haystack.length) return -1; let len=needle.length; let obj={}; //为了定位目标字符串中每个字符的位置,将每个字符存在对象中,值为该字符最后一次出现的索引 for(le ...
7 进制数
7 进制数
给定一个整数 num,将其转化为 7 进制,并以字符串形式输出。
输入: num = 100
输出: “202”
12345678910111213141516var convertToBase7 = function(num) { if (num === 0) { return "0"; } let negative = num < 0; num = Math.abs(num); const digits = []; while (num > 0) { digits.push(num % 7); num = Math.floor(num / 7); } if (negative) { digits.push('-'); } return digits.reverse().join('');};
找到所有数组中消失的数字
找到所有数组中消失的数字
给一个含 n 个整数的数组 nums ,其中 nums[i] 在区间 [1, n] 内。请你找出所有在 [1, n] 范围内但没有出现在 nums 中的数字,并以数组的形式返回结果。
输入:nums = [4,3,2,7,8,2,3,1]
输出:[5,6]
1234567891011121314var findDisappearedNumbers = function(nums) { const n = nums.length; for (const num of nums) { const x = (num - 1) % n; nums[x] += n; } const ret = []; for (const [i, num] of nums.entries()) { if (num <= n) { ret.push(i + 1); } } return r ...
3 的幂
3 的幂
给定一个整数,写一个函数来判断它是否是 3 的幂次方。如果是,返回 true ;否则,返回 false 。整数 n 是 3 的幂次方需满足:存在整数 x 使得 n == 3x
输入:n = 27
输出:true
123456var isPowerOfThree = function(n) { while (n !== 0 && n % 3 === 0) { n = Math.floor(n / 3); } return n === 1;};
重温浏览器知识-通讯
浏览器是如何进行界面渲染的?
不同的渲染引擎的具体做法稍有差异,但是大体流程都是差不多的,下面以 chrome渲染引擎 的 渲染流程来说明:
获取 HTML ⽂件并进⾏解析,生成一棵 DOM 树(DOM Tree)
解析 HTML 的同时也会解析 CSS,⽣成样式规则(Style Rules)
根据 DOM 树和样式规则,生成一棵渲染树(Render Tree)
进行布局(Layout)(重排),即为每个节点分配⼀个在屏幕上应显示的确切坐标位置
进⾏绘制(Paint)(重绘),遍历渲染树节点,调⽤ GPU(图形处理器) 将元素呈现出来
前端如何实现即时通讯?websocket严格意义上: HTTP协议只能做到客户端请求服务器, 服务器做出响应, 做不到让服务器主动给客户端推送消息!那么如果服务器数据更新了, 想要即时通知到客户端怎么办呢 ? (即时通信需求)即时通信需求: 服务器数据一有更新, 希望推送给到浏览器提问的回答重心:
即时通信有哪些方案?
为什么使用了其中某一个方案! websocket
基于Web的前端,存在以下几种可实现即时通讯的方式:
短轮询 (历 ...
重温浏览器知识-安全2
前端安全了解吗,说一下 XSS 和 CSRF,以及怎么规避XSS:跨域脚本攻击
XSS 攻击指的是跨站脚本攻击,是一种代码注入攻击。攻击者通过在网站注入恶意脚本,使之在用户的浏览器上运行,从而盗取用户的信息如 cookie 等。XSS 的本质是因为网站没有对恶意代码进行过滤,与正常的代码混合在一起了,浏览器没有办法分辨哪些脚本是可信的,从而导致了恶意代码的执行。
攻击者可以通过这种攻击方式可以进行以下操作:
获取页面的数据,如DOM、cookie、localStorage;
DOS攻击,发送合理请求,占用服务器资源,从而使用户无法访问服务器;
破坏页面结构;
流量劫持(将链接指向某网站);
防御方法
可以从浏览器的执行来进行预防,一种是使用纯前端的方式,不用服务器端拼接后返回(不使用服务端渲染)。另一种是对需要插入到 HTML 中的代码做好充分的转义。对于 DOM 型的攻击,主要是前端脚本的不可靠而造成的,对于数据获取渲染和字符串拼接的时候应该对可能出现的恶意代码情况进行判断。
CSRF:跨站请求伪造
CSRF 攻击指的是跨站请求伪造攻击,攻击者诱导用户进入一个第三方网站 ...
