Js

基本类型
1.递归

函数自己调用自己
注意:递归也是一种循环,注意循环条件的处理,避免出现非必要的无线循环。

code

    let datas = [{name: '第一阶段 Js 基础入门',checked:true,children: [{name: '第一章 走入 JavaScript ',checked:false,children: [{name: 'JavaScript 简介',checked:true,},{name: 'JavaScript可以做什么?',checked:false,}]} ]},{name: '第二阶段 Js 基础入门',checked:false,children: [{name: '第一章 走入 JavaScript ',checked:false,children: [{name: 'JavaScript 简介',checked:false,},{name: 'JavaScript可以做什么?',checked:false,}]} ]}]/* 01 forEach循环 */// datas.forEach( data =>{//   html += `//     <li>${data.name}</li>//   `// })// ulElement.innerHTML = html/* 02 map循环 */// ulElement.innerHTML =  datas.map( data =>{//   return `//   <li>${data.name}</li>//   `// }).join('')ulElement.innerHTML =  createHtml(datas)function createHtml( items, leave=0 ) {return items.map( item =>{let str=  `<li style="padding-left:${30*leava}px">${item.name}</li>`;if( Array.isArray( item.children ) ) {str += createHtml(item.children, leave+ 1)}return str;}).join('')}

效果

  • 第一阶段 Js 基础入门
  • 第一章 走入 JavaScript
  • JavaScript 简介
  • JavaScript可以做什么?
  • 第二阶段 Js 基础入门
  • 第一章 走入 JavaScript
  • JavaScript 简介
  • JavaScript可以做什么?

2. 数组扁平化(降维)

问题:现有数据结构不利于数据检索

  • Array.prototype.flat() 参数 depth 可选 指定要提取嵌套数组的结构深度,默认值为 1。 ( Infinity )无穷

flat() 方法会按照一个可指定的深度递归遍历数组,并将所有元素与遍历到的子数组中的元素合并为一个新数组返回

  • Array.prototype.reduce(function(total, currentValue, currentIndex, arr), initialValue):es5.1 addfled 相当于累加器
    两个参数

code ( datas ) 同上


//数据扁平化处理01.function flat(items) {let newArr = [];items.forEach ( item =>{newArr.push(item)if(Array.isArray( item.children )) {newArr =  newArr.concat(flat(item.children))}} )return newArr;}console.log( flat(datas) )let newItems = flat(datas)console.log(newItems.filter( item => item.checked))02.function flat (items) {return items.reduce( ( pre, current ) =>{return pre.concat(current,Array.isArray( current.children ) ? flat( current.children ) : [])},[] )}console.log( flat(datas) )let newItems = flat(datas)console.log(newItems.filter( item => item.checked))     

排序
1.sort()

code


<body><table id="Table" width='100%', border="1px"><thead><tr><th>章节</th><th>类型</th><th>知识点</th></tr></thead><tbody></tboby> </table></body><script>let datas = [{chapter: 22,type: '客户端信息存储',title: 'cookie'},{chapter: 23,type: '前后端交互',title: 'XMLHttpRequest 对象'},{chapter: 22,type: '客户端信息存储',title: 'Application Cache'}];let Table = document.querySelector('#Table');let Tbody = Table.tBodies[0];datas.sort((a, b) => a.chapter - b.chapter);Tbody.innerHTML = creatHTML( datas )function creatHTML( items ){return items.map(item => {return `<tr><td> ${item.chapter} </td>  <td> ${item.type} </td> <td> ${item.title} </td> <tr>`}).join('')}</script>
2.冒泡排序

code

<script>
//冒泡排序 从左到右 ,两两相比  , isOk 判断当前是否排序好了!let arr1 = [6,1,2,7,9,3,4,5,10,8]for(let j=0;j<arr1.length;j++) {let isOk = truefor(let i=0; i<arr1.length-1-j;i++){let a = arr1[i];let b = arr1[i+1];if(a > b ){arr1[i] = b;arr1[i+1] = aisOk = false}}if(isOk) {break;}console.log( arr1.toString() )}console.log(arr1)</script>
3.快速排序
4.递归及递归执行排序
去重
1. new set()

code (得到结果是对象)

let arr1 = [1,1,2,2,3,3]let s1 = new Set(arr2)console.log(s1)
2. … 扩展运算符

code (得到结果是数组)

let arr1 = [1,1,2,2,3,3]let arr2 = [...arr1];console.log(arr2)]
3.对象去重

code

  let arr = [{key: 22,type: '客户端信息存储',title: 'cookie'},{key: 23,type: '前后端交互',title: 'XMLHttpRequest 对象'},{key: 22,type: '客户端信息存储',title: 'Application Cache'}
];var obj = {};
arr = arr.reduce(function(item, next) {obj[next.key] ? '' : obj[next.key] = true && item.push(next);return item;
}, []);
console.log(arr);

对象遍历 (理解数据监听)
  • Object.defineProperty
  • 对象属性描述符
  • configurable (可配)
  • enumerable (可枚举)
  • 数据描述符
  • value
  • writable

-存取描述符

  • get
  • set

Object.defineProperty

//writable   默认false , 不可以对象值的修改
// configurable (可配)
// enumerable (可枚举)let obj = {x:1}Object.defineProperty(obj,'y',{value:100,writable:true,enumerable:false})obj.y = 10000console.log(obj)for( let k in obj ) {console.log(k)  // 因为设置了 enumerable : false  , 所以y  不会显示}

for in 遍历对象

   let obj = {x:1,y:2}for (let k in obj){console.log( k )}

迭代器&迭代协议
1.可迭代协议允许:

JavaScript 对象去定义或定制它们的迭代行为, 例如(定义)在一个 for…of 结构中什么值可以被循环(得到)。一些内置类型都是内置的可迭代类型并且有默认的迭代行为, 比如 Array or Map, 另一些类型则不是 (比如Object) 。

为了变成可迭代对象, 一个对象必须实现 @@iterator 方法, 意思是这个对象(或者它原型链 prototype chain 上的某个对象)必须有一个名字是 Symbol.iterator 的属性:

属性
[Symbol.iterator] 返回一个对象的无参函数,被返回对象符合迭代器协议。

2.迭代器
Symbol.iterator 属性

3.迭代协议

  • 迭代器返回一个包含next方法的对象
  • next方法返回一个包含 done和value的对象
  • done是一个 boolean值
    true 表示迭代结束 ,
    false 表示继续迭代

value 表示任意类型的值,也就是迭代过程中的值

  let obj = {x:1,y:2}obj[Symbol.iterator] = function() {let keys = Object.keys(obj);console.log(keys)let len = keys.length;let n  = 0;return {next () {if (n<len) {return {done: false,// value:keys[n++]value:{k:keys[n],v:obj[keys[n++]]}}} else {return {done: true}}}}}for(let v of obj){console.log(v)}

for of 遍历数组

  let arr1 = ['a','b','c']for(let v in arr1) {console.log(v)// 打印出 : 0,1,2}for(let v of arr1) {console.log(v)// 打印出 : a,b,c}

深拷贝和浅拷贝的概念

1.浅拷贝

  • 浅拷贝只是复制了对象的引用地址,两个对象指向同一个内存地址,所以修改其中任意的值,另一个值都会随之变化,这就是浅拷贝(例:assign())

2.深拷贝 ( cloneDeep() )

  • 深拷贝是将对象及值复制过来,两个对象修改其中任意的值另一个值不会改变,这就是深拷贝(例:JSON.parse()和JSON.stringify(),但是此方法无法复制函数类型)

JS中的异步操作

1、定时器都是异步操作
2、事件绑定都是异步操作
3、AJAX中一般我们都采取异步操作(也可以同步)
4、回调函数可以理解为异步(不是严谨的异步操作)

js数据类型简介:

1.JavaScript(以下简称js)的数据类型分为两种:原始类型(即基本数据类型)和对象类型(即引用数据类型);2.js常用的基本数据类型包括undefined、null、number、boolean、string、Symbol;3.js的引用数据类型也就是对象类型Object,比如:Object、array、function、data等;

备注:
Symbol类型是保证每个属性的名字都是独一无二的


js如何判断数组是Array类型

方法一: 使用instanceof方法

instanceof 用于判断一个变量是否某个对象的实例,左边操作数是一个对象,右边操作数是一个函数对象或者函数构造器。原理是通过判断左操作数的对象的原型链上是否具有右操作数的构造函数的prototype属性。

举一个例子:

var arr=[];
console.log(arr instanceof Array)
//返回true

方法二: 使用constructor方法

在W3C定义中的定义:constructor 属性返回对创建此对象的数组函数的引用,就是返回对象相对应的构造函数。从定义上来说跟instanceof不太一致,但效果都是一样的。
那么判断各种类型的方法:
console.log([].constructor == Array);  //true
console.log({}.constructor == Object);  //true
console.log("string".constructor == String); //true
console.log((123).constructor == Number);  //true
console.log(true.constructor == Boolean);  //true

方法三: 使用Object.prototype.toString.call(arr) === '[object Array]'方法

function isArray(o) {return Object.prototype.toString.call(o);
}
var arr=[2,5,6,8];
var obj={name:'zhangsan',age:25};
var fn = function () {}
console.log(isArray(arr)); //[object Array]
console.log(isArray(obj)); //[object Object]
console.log(isArray(fn));  //[object function]

方法四:ES5定义了Array.isArray:

Array.isArray([]) //true

数组遍历

  • 1.for循环

使用临时变量,将长度缓存起来,避免重复获取数组长度,当数组较大时优化效果才会比较明显。

for(j = 0,len=arr.length; j < len; j++) {}
  • 2.foreach循环

遍历数组中的每一项,没有返回值,对原数组没有影响,不支持IE

//1 没有返回值
arr.forEach((item,index,array)=>{//执行代码
})
//参数:value数组中的当前项, index当前项的索引, array原始数组;
//数组中有几项,那么传递进去的匿名回调函数就需要执行几次;
  • 3.map循环

有返回值,可以return出来
map的回调函数中支持return返回值;return的是啥,相当于把数组中的这一项变为啥(并不影响原来的数组,只是相当于把原数组克隆一份,把克隆的这一份的数组中的对应项改变了);

arr.map(function(value,index,array){//do somethingreturn XXX})var ary = [12,23,24,42,1];
var res = ary.map(function (item,index,ary ) { return item*10;
})
console.log(res);//-->[120,230,240,420,10];  原数组拷贝了一份,并进行了修改
console.log(ary);//-->[12,23,24,42,1];  原数组并未发生变化
  • 4.forof遍历

可以正确响应break、continue和return语句

for (var value of myArray) {
console.log(value);
}
  • 5.filter遍历

不会改变原始数组,返回新数组

var arr = [{ id: 1, text: 'aa', done: true },{ id: 2, text: 'bb', done: false }
]
console.log(arr.filter(item => item.done))// 转换成ES
arr.filter(function (item) {return item.done;
});var arr = [73,84,56, 22,100]
var newArr = arr.filter(item => item>80)   //得到新数组 [84, 100]
console.log(newArr,arr)
  • 6.every遍历

every()是对数组中的每一项运行给定函数,如果该函数对每一项返回true,则返回true。

var arr = [ 1, 2, 3, 4, 5, 6 ];
console.log( arr.every( function( item, index, array ){ return item > 3; }));
false
  • 7.some遍历

some()是对数组中每一项运行指定函数,如果该函数对任一项返回true,则返回true。

var arr = [ 1, 2, 3, 4, 5, 6 ]; console.log( arr.some( function( item, index, array ){ return item > 3; }));
  • 8.reduce

reduce()方法接收一个函数作为累加器(accumulator),数组中的每个值(从左到右)开始缩减,最终为一个值。

var total = [0,1,2,3,4].reduce((a, b)=>a + b); //10

reduce接受一个函数,函数有四个参数,分别是:上一次的值,当前值,当前值的索引,数组

[0, 1, 2, 3, 4].reduce(function(previousValue, currentValue, index, array){return previousValue + currentValue;
});
循环次数 previousValue currentValue index array returnValue
first call 0 1 1 [0,1,2,3,4] 1
second call 1 2 2 [0,1,2,3,4] 3
third call 3 3 3 [0,1,2,3,4] 6
fourth call 6 4 4 [0,1,2,3,4] 10
  • 9.find

find()方法返回数组中符合测试函数条件的第一个元素。否则返回undefined

var stu = [{name: '张三',gender: '男',age: 20},{name: '王小毛',gender: '男',age: 20},{name: '李四',gender: '男',age: 20}
]function getStu(element){return element.name == '李四'
}stu.find(getStu)
//返回结果为
//{name: "李四", gender: "男", age: 20}

es6

stu.find((element) => (element.name == '李四'))
  • 10.findIndex

对于数组中的每个元素,findIndex 方法都会调用一次回调函数(采用升序索引顺序),直到有元素返回 true。只要有一个元素返回 true,findIndex 立即返回该返回 true 的元素的索引值。如果数组中没有任何元素返回 true,则 findIndex 返回 -1。
findIndex 不会改变数组对象

 [1,2,3].findIndex(function(x) { x == 2; });
// Returns an index value of 1.[1,2,3].findIndex(x => x == 4);
// Returns an index value of -1.

call和applay,band的区别

相同点
1、都是用来改变函数的this对象的指向的。
2、第一个参数都是this要指向的对象。
3、都可以利用后续参数传参。

var xw = {name : "小王",gender : "男",age : 24,say : function() {alert(this.name + " , " + this.gender + " ,今年" + this.age);       }
}
var xh = {name : "小红",gender : "女",age : 18
}
xw.say();----------xw.say.call(xh);xw.say.apply(xh);xw.say.bind(xh)();

区别

1.call和apply都是对函数的直接调用,而bind方法返回的仍然是一个函数

2.call后面的参数与say方法中是一一对应的,而apply的第二个参数是一个数组,数组中的元素是和say方法中一一对应的,这就是两者最大的区别

 var xw = {name : "小王",gender : "男",age : 24,say : function(school,grade) {alert(this.name + " , " + this.gender + " ,今年" + this.age + " ,在" + school + "上" + grade);                                }}var xh = {name : "小红",gender : "女",age : 18}------------------xw.say.call(xh,"实验小学","六年级");  xw.say.apply(xh,["实验小学","六年级"]);xw.say.bind(xh,"实验小学","六年级")();

ES6新特性

1.es5和es6的区别,说一下你所知道的es6
  ECMAScript5,即ES5,是ECMAScript的第五次修订,于2009年完成标准化ECMAScript6,即ES6,是ECMAScript的第六次修订,于2015年完成,也称ES2015ES6是继ES5之后的一次改进,相对于ES5更加简洁,提高了开发效率
2.ES6新增的一些特性
1)let声明变量和const声明常量,两个都有块级作用域ES5中是没有块级作用域的,并且var有变量提升,在let中,使用的变量一定要进行声明2)箭头函数ES6中的函数定义不再使用关键字function(),而是利用了()=>来进行定义3)模板字符串模板字符串是增强版的字符串,用反引号(`)标识,可以当作普通字符串使用,也可以用来定义多行字符串4)解构赋值ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值5)for of循环for...of循环可以遍历数组、Set和Map结构、某些类似数组的对象、对象,以及字符串6)import、export导入导出ES6标准中,Js原生支持模块(module)。将JS代码分割成不同功能的小块进行模块化,将不同功能的代码分别写在不同文件中,各模块只需导出公共接口部分,然后通过模块的导入的方式可以在其他地方使用7)set数据结构Set数据结构,类似数组。所有的数据都是唯一的,没有重复的值。它本身是一个构造函数8)... 展开运算符可以将数组或对象里面的值展开;还可以将多个值收集为一个变量9)修饰器 @decorator是一个函数,用来修改类甚至于是方法的行为。修饰器本质就是编译时执行的函数10)class 类的继承ES6中不再像ES5一样使用原型链实现继承,而是引入Class这个概念11)async、await使用 async/await, 搭配promise,可以通过编写形似同步的代码来处理异步流程, 提高代码的简洁性和可读性async 用于申明一个 function 是异步的,而 await 用于等待一个异步方法执行完成12)promisePromise是异步编程的一种解决方案,比传统的解决方案(回调函数和事件)更合理、强大13)SymbolSymbol是一种基本类型。Symbol 通过调用symbol函数产生,它接收一个可选的名字参数,该函数返回的symbol是唯一的14)Proxy代理使用代理(Proxy)监听对象的操作,然后可以做一些相应事情
3、var、let、const之间的区别
  var声明变量可以重复声明,而let不可以重复声明var是不受限于块级的,而let是受限于块级var会与window相映射(会挂一个属性),而let不与window相映射var可以在声明的上面访问变量,而let有暂存死区,在声明的上面访问变量会报错const声明之后必须赋值,否则会报错const定义不可变的量,改变了就会报错const和let一样不会与window相映射、支持块级作用域、在声明的上面访问变量会报错
4、使用箭头函数应注意什么?
  (1)用了箭头函数,this就不是指向window,而是父级(指向是可变的)(2)不能够使用arguments对象(3)不能用作构造函数,这就是说不能够使用new命令,否则会抛出一个错误(4)不可以使用yield命令,因此箭头函数不能用作 Generator 函数
5 ES6的模板字符串有哪些新特性?并实现一个类模板字符串的功能
基本的字符串格式化。将表达式嵌入字符串中进行拼接。用${}来界定在ES5时我们通过反斜杠()来做多行字符串或者字符串一行行拼接。ES6反引号(``)就能解决
6.介绍下 Set、Map的区别?
应用场景Set用于数据重组,Map用于数据储存Set: (1)成员不能重复(2)只有键值没有键名,类似数组(3)可以遍历,方法有add, delete,hasMap:(1)本质上是健值对的集合,类似集合(2)可以遍历,可以跟各种数据格式转换
7.ECMAScript 6 怎么写 class ,为何会出现 class?

ES6的class可以看作是一个语法糖,它的绝大部分功能ES5都可以做到,新的class写法只是让对象原型的写法更加清晰、更像面向对象编程的语法

class Point { constructor(x,y) { //构造方法this.x = x; //this关键字代表实例对象this.y = y; } toString() {return '(' + this.x + ',' + this.y + ')'; }
}
8.Promise构造函数是同步执行还是异步执行,那么 then 方法呢?
promise构造函数是同步执行的,then方法是异步执行的
9.setTimeout、Promise、Async/Await 的区别
  事件循环中分为宏任务队列和微任务队列其中setTimeout的回调函数放到宏任务队列里,等到执行栈清空以后执行promise.then里的回调函数会放到相应宏任务的微任务队列里,等宏任务里面的同步代码执行完再执行async函数表示函数里面可能会有异步方法,await后面跟一个表达式async方法执行时,遇到await会立即执行表达式,然后把表达式后面的代码放到微任务队列里,让出执行栈让同步代码先执行
10.promise有几种状态,什么时候会进入catch?
  三个状态:pending、fulfilled、reject两个过程:padding -> fulfilled、padding -> rejected当pending为rejectd时,会进入catch
11.下面的输出结果是多少
const promise = new Promise((resolve, reject) => {console.log(1);resolve();console.log(2);
})promise.then(() => {console.log(3);
})console.log(4);-----输出结果 1 2 4 3
12.使用结构赋值,实现两个变量的值的交换
let a=1;
let b=2;[a,b] = [b,a];
13.设计一个对象,键名的类型至少包含一个symbol类型,并且实现遍历所有key
 let name = Symbol('name');let product = {[name]:"洗衣机",    "price":799};Reflect.ownKeys(product);
14.下面Set结构,打印出的size值是多少
let s = new Set();
s.add([1]);
s.add([1]);console.log(s.size);

答案:2
两个数组[1]并不是同一个值,它们分别定义的数组,在内存中分别对应着不同的存储地址,因此并不是相同的值
都能存储到Set结构中,所以size为2

15.Promise 中reject 和 catch 处理上有什么区别
  reject 是用来抛出异常,catch 是用来处理异常reject 是 Promise 的方法,而 catch 是 Promise 实例的方法reject后的东西,一定会进入then中的第二个回调,如果then中没有写第二个回调,则进入catch网络异常(比如断网),会直接进入catch而不会进入then的第二个回调
16.使用class 手写一个promise
//创建一个Promise的类class Promise{constructor(executer){//构造函数constructor里面是个执行器this.status = 'pending';//默认的状态 pendingthis.value = undefined//成功的值默认undefinedthis.reason = undefined//失败的值默认undefined//状态只有在pending时候才能改变let resolveFn = value =>{//判断只有等待时才能resolve成功if(this.status == pending){this.status = 'resolve';this.value = value;}}//判断只有等待时才能reject失败let rejectFn = reason =>{if(this.status == pending){this.status = 'reject';this.reason = reason;}}    try{//把resolve和reject两个函数传给执行器executerexecuter(resolve,reject);}catch(e){reject(e);//失败的话进catch}}then(onFufilled,onReject){//如果状态成功调用onFufilledif(this.status = 'resolve'){onFufilled(this.value);}//如果状态失败调用onRejectif(this.status = 'reject'){onReject(this.reason);}}}
17.如何使用Set去重
let arr = [12,43,23,43,68,12];
let item = [...new Set(arr)];
console.log(item);//[12, 43, 23, 68]
18.将下面for循环改成for of形式
let arr = [11,22,33,44,55];
let sum = 0;
for(let i=0;i<arr.length;i++){sum += arr[i];
}

答案

let arr = [11,22,33,44,55];
let sum = 0;
for(value of arr){sum += value;
}
19.理解 async/await以及对Generator的优势
   async await 是用来解决异步的,async函数是Generator函数的语法糖使用关键字async来表示,在函数内部使用 await 来表示异步async函数返回一个 Promise 对象,可以使用then方法添加回调函数当函数执行的时候,一旦遇到await就会先返回,等到异步操作完成,再接着执行函数体内后面的语句async较Generator的优势:(1)内置执行器。Generator 函数的执行必须依靠执行器,而 Aysnc 函数自带执行器,调用方式跟普通函数的调用一样(2)更好的语义。async 和 await 相较于 * 和 yield 更加语义化  (3)更广的适用性。yield命令后面只能是 Thunk 函数或 Promise对象,async函数的await后面可以是Promise也可以是原始类型的值(4)返回值是 Promise。async 函数返回的是 Promise 对象,比Generator函数返回的Iterator对象方便,可以直接使用 then() 方法进行调用
20、forEach、for in、for of三者区别
  forEach更多的用来遍历数组for in 一般常用来遍历对象或jsonfor of数组对象都可以遍历,遍历对象需要通过和Object.keys()for in循环出的是key,for of循环出的是value
21.说一下es6的导入导出模块

导入通过import关键字

// 只导入一个
import {sum} from "./example.js"// 导入多个
import {sum,multiply,time} from "./exportExample.js"// 导入一整个模块
import * as example from "./exportExample.js"

导出通过export关键字

//可以将export放在任何变量,函数或类声明的前面
export var firstName = 'Michael';
export var lastName = 'Jackson';
export var year = 1958;//也可以使用大括号指定所要输出的一组变量
var firstName = 'Michael';
var lastName = 'Jackson';
var year = 1958;
export {firstName, lastName, year};//使用export default时,对应的import语句不需要使用大括号
let bosh = function crs(){}
export default bosh;
import crc from 'crc';//不使用export default时,对应的import语句需要使用大括号
let bosh = function crs(){}
export bosh;
import {crc} from 'crc';

js继承

Es6继承

闭包的理解

什么是闭包

学术说法:闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。(你能看懂吗?反正我不能)
专业说法:函数对象可以通过作用域链相互关联起来,函数体内部的变量都可以保存在函数作用域内。(这个你懂吗?我略懂)

通俗说法:所有JavaScript函数都是闭包,因为函数都是对象,都关联到作用域,并且变量都保存在函数作用域内。(这个有点扯,困惑我的闭包,就这么简单)

但是我们通常说的闭包是当一个函数嵌套另一个函数,外部函数将嵌套函数对象作为返回值返回的时候,我们把这种情况称为闭包。

function func() {var num = 0;            //声明局部变量:numfunction f() {          //嵌套函数,在作用域里console.log(++num)}return f();             //调用嵌套函数f,并将f的执行结果返回
}
func();                     //输出:1
this指向问题
原型链操作

js 不得不知道的秘密相关推荐

  1. 关于插画师,大家不知道的“秘密”

    关于插画师,大家不知道的"秘密" 现如今,插画师是已然成为了一个吸金又吸睛的火爆职业,学习插画师往后的就业面也是非常的广泛,无论是从事广告行业.动漫行业.亦或者是出版行业,甚至是成 ...

  2. 知道python不_99%的Python程序员都不知道的秘密

    原标题:99%的Python程序员都不知道的秘密 Python程序玩了好几年,但是估计99%的程序员都不知道Python竟然隐藏2个秘密,里面竟然还有彩蛋.Python核心程序开发人员真的是太有才了, ...

  3. 怎么找出电脑里隐藏的流氓软件_9成人都不知道的秘密!那些隐藏在你电脑里的“大象”!...

    不知道小伙伴们有没有发现,身边总有这样的事情,我们一直将他当做定理,从来没有疑惑过他产生的原因.(就比如帅雷雷为什么这么帅?)英文中有句短语将这种现象称为"elephant in the r ...

  4. 99%的产品经理不知道的秘密:如何招程序猿喜欢?

    互联网圈里好多逗逼的事情,尤以产品经理与程序员的斗法为甚,搞笑段子频出,更有好事者据此整理出了各种撕逼宝典,给一些不太成熟的产品经理.程序员造成了很大的困扰,已经严重到影响工作的正常开展. 本人从事互 ...

  5. PMCAFF微分享 | 京东首席搜索专家,告诉你电商搜索你不得不知道的秘密

    本期主题 | 京东搜索下拉框产品个性化探索 分享时间 | 7月9日(周五)21:00 分享地点 | PMcaff B端产品经理群 进群方式 | 请加管理员微信:kit alt [本期嘉宾] 商倩兰 京 ...

  6. T-SQL里数据库工程师都不知道的秘密之SQL Server自定义函数UDF

    T-SQL SQL Server UDF自定义函数概念与案例实战 函数的定义 这里的函数指的是用户自定义函数(UDF)全名为(user-defined function),以下简称为函数. 它是数据库 ...

  7. 民间75个不传之密 ,医院都不知道的秘密

    1.头痛(各种头痛均可): 生白萝卜汁,每次滴鼻孔两滴(两鼻孔都滴),一日两次,连用4-5天,可除根.忌吃花椒.胡椒. 2.头晕(头昏眼花.晕眩): 鸭蛋一个.赤豆20粒,搅匀蒸熟,早晨空服,每日一次 ...

  8. 抖音变现模式?80%的人都不知道的秘密,三类更适合玩私域的产品

    这篇内容关于适合玩私域的三类产品,精简一下让大家可以3分钟看完.不玩悬念,直接上千货. 上一篇在我赢助手小禾呈序上给大家讲了三个变现的建议,以及两种我比较推荐的变现方式.带货和支付费.今天再讲一个主流 ...

  9. 快来,别人不知道的秘密,QQ空间视频下载教程

    打开自己的QQ空间,进入视频界面 先按F12跳出,浏览器调试工具 点击XHR,输入框输入"video_get_data",然后点击你想要下载的视频得到一个链接地址 点击链接,再点解 ...

最新文章

  1. 使用PHP顶替JS有趣DOM
  2. php和python对比-通过PHP与Python代码对比浅析语法差异
  3. sql 给数据库表 字段 添加注释
  4. flume+elasticsearch日志收集分析
  5. 资深工程师为何否定这种单例模式
  6. setState是异步还是同步?
  7. 计算机兴趣班记录,计算机兴趣班活动记录.doc
  8. 恭喜上周2期R和Python送书的8位中奖者!
  9. Simulink随手记
  10. Nginx+Keepalived主备配置
  11. 正确修改LINUX SHELL的.bashrc,显示短路径
  12. 最小二乘支持向量机--LSSVM分类及MATLAB代码实现
  13. 多人共同在线文档协同编辑的技术实现
  14. 小米手机系统服务组件是干什么的_2799 元!小米 1 亿像素拍照手机来了,还有 MIUI 系统的小米手表...
  15. Intel(R) WiFi Link 5100 AGN 破解无线网络 BT4正式版U盘启动
  16. 运营商-银联-手机厂商,三巨头如何依次主导NFC
  17. 南京(选自 余秋雨《文化苦旅》)
  18. net logon服务无法启动
  19. 何为集中式版本控制系统与分布式版本控制系统?
  20. MES管理系统生产调度管理功能的作用介绍

热门文章

  1. Java实现 LeetCode 242 有效的字母异位词
  2. 质量保证漫漫谈之QA、QC、QM的关系与区别
  3. MAC下快捷键、指令(持续更新。。。)
  4. 【调剂】江汉大学2021年硕士研究生招生接收调剂公告(二)
  5. 【学习】小结《网络经济与企业管理》
  6. lseek函数的用法
  7. 30+小哥哥从央企离职,转行软件测试,入职薪资11K
  8. CURL中的curl_close($ch)、return
  9. sql注入及用PrepareStatement就不用担心sql注入了吗?
  10. 西南大学计算机科学与技术学院怎么样,西南大学计算机科学与技术专业考研录取比例-报录比-研究生录取人数...