赞
踩
function addNumFun(a,b){
const maxLen = Math.max(
a.toString().split('.')[1].length,
b.toString().split('.')[1].length
)
const base = Math.pow(10,maxLen)
return (a*base + b*base) / base
}
第一版的JavaScript是用32位比特来存储值的,且是通过值的低1位或低3位来识别类型的。
1:整型(int)
000:引用类型object
010:双精度浮点型double
100:字符串string
110:布尔型boolean
另外还有两个特殊值:undefined用整数-2^30,不在整型的范围内;null机器码空指针,第三位也是000
function _new(constructer, ...arg) {
// 创建一个空的对象
let resultObj = {};
// 链接该对象到原型,这样新对象就能访问到原型上面的方法
resultObj.__proto__ = constructer.prototype;
// 然后实现步骤3,将新创建的对象作为this的上下文
let result = constructer.call(resultObj, ...arg);
// 实现步骤4:如果该函数没有返回对象(即result不是一个对象),则返回this(即resultObj)
return typeOf result === 'object' ? result : resultobj
}
静态方法:指部署在Object对象自身的方法。
function f1(a) {
function f2() {
console.log(a);
}
return f2;
}
var fun = f1(1);
setTimeout(fun,1000);//一秒之后打印出1
function print(fn){
const a = 200
fn()
}
const a = 100
function fn(){
console.log(a)
}
print(fn) // 100
(2)函数作为返回值被返回
function create(){
const a = 100
return function(){
console.log(a)
}
}
const fn = create()
const a = 200
fn() // 100
function createCache(){
const data = {} //闭包中被隐藏的数据,不被外界访问
return {
set:function(key,val){
data[key]=val
},
get:function(key){
return data[key]
}
}
}
const c = createCache()
c.set('a',100)
console.log(c.get('a')) // 100
undefined代表未定义,null代表空对象(主要用于对象初始化)
function isObject(o){ return Object.prototype.toString.call(o) === '[object Object]' || Object.prototype.toString.call(o) === '[object Array]' } function deepClone(o){ if (isObject(o)) { let obj = Array.isArray(o) ? [] : {} for(let item in o){ if(isObject(o[item])){ obj[item] = deepClone(o[item]) }else{ obj[item] = o[item] } } return obj } else { return o } }
构造函数的arguments:类数组
箭头函数的rest:
var foo = (...args) => {
console.log(args) // [1,2,3]
}
foo(1,2,3)
JSONP:JSONP利用了script标签可以任意跨域的特点实现的。img的src、link的href、script的src都没有被同源策略限制到。缺点:只支持get请求。
(1)原生js实现:
<script>
var script = document.createElement('script');
script.type = 'text/javascript';
// 传参一个回调函数名给后端,方便后端返回时执行这个在前端定义的回调函数
script.src = 'http://www.domain2.com:8080/loginuser=admin&callback=handleCallback';
document.head.appendChild(script);
// 回调执行函数
function handleCallback(res) {
alert(JSON.stringify(res));
}
</script>
(2)jQuery Ajax实现
$.ajax({
url:'',
type:'GET',
dataType:'jsonp',
success:function(data){
console.log(data)
}
})
(3)Vue axios实现
this.$http = axios
this.$http.jsonp(url,{
params:{},
jsonp:'handleCallback'
}).then(res => {
console.log(res)
})
document.domain + iframe:只有在主域相同的时候才使用它
location.hash + iframe
window.name + iframe
CORS:通过自定义请求头来让服务器和浏览器进行沟通
nginx代理跨域:nginx模拟一个虚拟服务器,因为服务器与服务器之间是不存在跨域的;发送数据时,客户端 -> nginx -> 服务端;返回数据时,服务端 -> nginx -> 客户端
vue 配置proxy代理,原理:在本地运行npm run serve等命令时实际上是用node运行了一个服务器,因此proxy实际上是将请求发给自己的服务器,再由服务器转发给后台服务器,做了一层代理。
DOM2级事件规定事件流包含三个阶段:事件捕获阶段、目标阶段、事件冒泡阶段。
DOM2级事件定义了两个方法:addEventListener()和removeEventListener(),包含三个参数:第一个参数是要处理的事件方式(如click-);第二个是事件处理的函数,可以是匿名函数,也可以是具名函数,但如果需要删除事件,必须是剧名函数;第三个参数是一个布尔值,true表示在捕获阶段调用事件处理程序,false表示在冒泡阶段,默认是false
function debounce (fn,delay) {
let timer
return function () {
if(timer) clearTimeout(timer)
timer = setTimeout(fn,delay)
}
}
function throttle (fn,delay) {
let timer
return function () {
if(!timer){
timer = setTimeout(() => {
timer = null
fn()
},delay)
}
}
}
var a = {
user:"追梦子",
fn:function(e,d,f){
console.log(this.user); //追梦子
console.log(e,d,f); //10 1 2
}
}
var b = a.fn;
var c = b.bind(a,10);
c(1,2);
Array.prototype.method=function(){}
var myArray=[1,2,4];
myArray.name="数组";
for (var index in myArray) {
console.log(myArray[index]); //0,1,2,method,name
}
for (var value of myArray) {
console.log(value); //1,2,4
}
localStorage.setItem('key','item')
localStorage.getItem('key')
localStorage.removeItem('key')
localStorage.clear() //全部清除
document.cookie = "username=jay;expire=Thu, 18 Dec 2043 12:00:00 GMT"
//删除时,不需要指定cookie的值
document.cookie = "name=;expire=以前的时间"
const SingleMode = (function () { let instance = null function Single (name) { this.name = name } return function (name) { if (!instance) { instance = new Single(name) } return instance } })() const oA = new SingleMode('jay') const oB = new SingleMode('hll') console.log(oA) // {name:'jay'} console.log(oB) // {name:'jay'} console.log(oA === oB) // true
function factoryMode (o) {
const instance = {}
instance.name = o.name
instance.age = o.age
instance.getInstance = function () {
return 'name:' + instance.name + ',age:' + instance.age
}
return instance
}
const obj1 = factoryMode({ name: 'jay', age: '18' })
const obj2 = factoryMode({ name: 'hll', age: '5' })
console.log(obj1) // {name:'jay',age:18,getInstance:f()}
console.log(obj2) // {name:'hll',age:5,getInstance:f()}
const each = function (arr, callback) {
for (let i = 0; i < arr.length; i++) {
// 将值、索引返回给回调函数处理
if (callback(i, arr[i]) === false) {
break// 中止迭代器,跳出循环
}
}
}
// 外部调用
each([1, 2, 3, 4, 5], (index, value) => {
if (value > 3) {
return false // 返回false中止each
}
console.log([index, value]) // [0,1] [1,2] [2,3]
})
function Parent (name) {
this.name = name
}
function Son () {
}
Son.prototype = new Parent()
Son.prototype.name = 'jay'
const son = new Son()
console.log(son.name) // jay
console.log(son instanceof Parent) // true
console.log(son instanceof Son) // true
function Parent (name) {
this.name = name
}
function Son (name, age) {
Parent.call(this, name)
this.age = age
}
Son.prototype = new Parent()
Son.prototype.constructor = Son
const son = new Son('jay', 18)
console.log(son) // {name:'jay',age:18}
console.log(son instanceof Parent) // true
console.log(son instanceof Son) // true
function Parent (name) {
this.name = name
}
function Son (name, age) {
Parent.call(this, name)
this.age = age
}
Son.prototype = Object.create(Parent.prototype)
Son.prototype.constructor = Son
const son = new Son('jay', 18)
console.log(son) // {name:'jay',age:18}
console.log(son instanceof Parent) // true
console.log(son instanceof Son) // true
如果下一行的第一个字元是下面5个字符之一,JavaScript将不对上一行句尾添加分号:“(”、“[”、“/”、“+”、“-”
const str = 'http://baidu.com?name=jay&age=18&sex=0'
const arr = str.slice(str.indexOf('?') + 1).split('&')
const obj = {}
arr.forEach(item => {
const tempArr = item.split('=')
obj[tempArr[0]] = tempArr[1]
})
console.log(obj)
http无法让服务端主动去发送信息,为了解决这个问题,我们有三种常见的解决方案:短轮询、长轮询、webSocket
// 创建一个webSocket对象
var ws = new webSocket('wss://webchat-bj-test5.clink.cn')
// 实例化对象的onopen属性,用于指定连接成功后的回调函数
ws.onopen = function(evt){
ws.send('hello')
}
// 实例化对象的onmessage属性,用于指定收到服务器数据后的回调函数
ws.onmessage = function(evt){
console.log(evt.data)
ws.close()
}
// 实例化对象的onclose属性,用于指定连接关闭后的回调函数
ws.onclose = function(evt){
}
var ul = document.getElementById('ul')
for(var i=0;i<100;i++){
var li = document.createElement('li')
li.innerHTML = 'index:' + i
ul.appendChild(li)
}
优化dom操作:使用DocumentFragment,它是没有父节点的最小的文档对象,用于存储HTML和XML片段。
var ul = document.getElementById('ul')
var fragment = document.createDocumentFragment()
for(var i=0;i<100;i++){
var li = document.createElement('li')
li.innerHTML = 'index:' + i
fragment .appendChild(li)
}
ul.appendChild(fragment)
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。