一、destructuring

  1.   ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构Destructuring
  1. //es5
  2. if(1){
  3. let cat = 'ken';
  4. let dog = 'lili';
  5. let zoo = {cat: cat, dog: dog};
  6. console.log(zoo) ; //Object {cat: "ken", dog: "lili"}
  7. }
  8. //用ES6完全可以像下面这么写:
  9. if(1){
  10. let cat = 'ken';
  11. let dog = 'lili';
  12. let zoo = {cat, dog};
  13. console.log(zoo) ; //Object {cat: "ken", dog: "lili"}
  14. }
  15. //反过来可以这么写:
  16. if(1){
  17. let dog = {type: 'animal', many: 2};
  18. let { type, many} = dog;
  19. console.log(type, many) ; //animal 2
  20. }

二、属性名表达式

  1.   用方法、表达式作为对象的属性名;表达式还可以用于定义方法名。
      JavaScript语言定义对象的属性,有两种方法。
  1. let obj1 = {};
  2. // 方法一
  3. obj1.foo = true;
  4. // 方法二
  5. obj1['a'+'bc'] = 123;
  6. console.log(obj1);
  1.   上面代码的方法一是直接用标识符作为属性名,方法二是用表达式作为属性名,这时要将表达式放在方括号之内。
      如果使用字面量方式定义对象(使用大括号),在ES5中只能使用方法一(标识符)定义属性。
  1. var obj2 = {
  2. foo: true,
  3. abc: 123
  4. }
  1.   ES6允许字面量定义对象时,用方法(表达式)作为对象的属性名,即把表达式放在方括号内。
  1. let propKey = 'foo';
  2. let obj3 = {
  3. [propKey]: true,
  4. ['a'+'bc']: 123
  5. };
  6. console.log(obj3);
  7. //表达式还可以用于定义方法名。
  8. let ello='i';
  9. let obj4 = {
  10. ['h'+ello]() {
  11. return 'hi nick';
  12. }
  13. };
  14. console.log(obj4.hi()); // hi nick

三、Object.is()

  1.   Object.is()用来比较两个值是否严格相等。它与严格比较运算符(===)的行为基本一致,不同之处只有两个:一是+0不等于-0,二是NaN等于自身。
  1. console.log(+0 === -0);//true
  2. console.log(NaN === NaN); // false
  3. console.log(Object.is(+0, -0)); // false
  4. console.log(Object.is(NaN, NaN)); // true

四、Object.assign()

  1.   Object.assign方法用来将源对象(source)的所有可枚举属性,复制到目标对象(target)。
      它至少需要两个对象作为参数,第一个参数是目标对象,后面的参数都是源对象。只要有一个参数不是对象,就会抛出TypeError错误。
  1. let target = { a: 1 };
  2. let source1 = { b: 2 };
  3. let source2 = { c: 3 };
  4. Object.assign(target, source1, source2);
  5. console.log(target); // {a:1, b:2, c:3}
  1. 注意:如果目标对象与源对象有同名属性,或多个源对象有同名属性,则后面的属性会覆盖前面的属性。
  1. let target1 = { a: 1, b: 1 };
  2. let source11 = { b: 2, c: 2 };
  3. let source21 = { c: 3 };
  4.  
  5. Object.assign(target1, source11, source21);
  6. console.log(target1); // {a:1, b:2, c:3}
  7. console.log(Object.assign({'name':'张三'},{'name':'nick','age':26,'sex':'男','sex':{'gander':'handsome'}}));
  1.   Object.assign只拷贝自身属性,不可枚举的属性(enumerablefalse)和继承的属性不会被拷贝。
  1. let obj1=Object.assign({b: 'c'},
  2. Object.defineProperty({}, 'invisible', {
  3. enumerable: false,
  4. value: 'hello'
  5. })
  6. );
  7. console.log(obj1);// { b: 'c' }
  8.  
  9. let obj2 =Object.assign({b: 'c'},
  10. Object.defineProperty({}, 'invisible', {
  11. enumerable: true,
  12. value: 'hello'
  13. })
  14. );
  15. console.log(obj2);// {b: "c", invisible: "hello"}
  1.   属性名为Symbol值的属性,也会被Object.assign拷贝。
  1. let obj3=Object.assign({ a: 'b' }, { [Symbol('c')]: 'd' })
  2. console.log(obj3);// { a: 'b', Symbol(c): 'd' }
  1. 注意:Object.assign可以用来处理数组,但是会把数组视为对象。
  1. Object.assign([1, 2, 3], [4, 5]);// [4, 5, 3]

  其中,4覆盖1,5覆盖2,因为它们在数组的同一位置,所以就对应位置覆盖了。  

  Object.assign还有很多用处,下面就看一下吧:   

  为对象添加属性

  1. class Point {
  2. constructor(x, y) {
  3. Object.assign(this, {x, y});
  4. }
  5. }

  这样就给Point类的对象实例添加了x、y属性。

  为对象添加方法

  1. let SomeClass={test:'nick'};
  2. SomeClass.prototype={};
  3. Object.assign(SomeClass.prototype, {
  4. someMethod:function(arg1, arg2) {
  5.  
  6. },
  7. anotherMethod:function () {
  8.  
  9. }
  10. });
  11. console.log(SomeClass);
  1.   等同于下面的写法
  1. let SomeClass2={test:'nick2'};
  2. SomeClass2.prototype={};
  3. SomeClass2.prototype.someMethod = function (arg1, arg2) {
  4.  
  5. };
  6. SomeClass2.prototype.anotherMethod = function () {
  7.  
  8. };
  9. console.log(SomeClass2);

  上面代码使用了对象属性的简洁表示法,直接将两个函数放在大括号中,再使用assign方法添加到SomeClass.prototype之中。

  克隆对象

  1. function clone1(origin) {
  2. return Object.assign({}, origin);
  3. }
  1.   上面代码将原始对象拷贝到一个空对象,就得到了原始对象的克隆。
      不过,采用这种方法克隆,只能克隆原始对象自身的值,不能克隆它继承的值。如果想要保持继承链,可以采用下面的代码。
  1. function clone2(origin) {
  2. let originProto = Object.getPrototypeOf(origin);
  3. return Object.assign(Object.create(originProto), origin);
  4. }

  在JS里子类利用Object.getPrototypeOf去调用父类方法,用来获取对象的原型。用它可以模仿Java的super。 

  多个对象合并到某个对象

  1. const merge1 =(target, ...sources) => Object.assign(target, ...sources);

  多个对象合并到一个新对象

  1. const merge2 = (...sources) => Object.assign({},...sources);

  为属性指定默认值

  1. const DEFAULTS = {
  2. logLevel: 0,
  3. outputFormat: 'html'
  4. };
  5.  
  6. function processContent(options) {
  7. let options1 = Object.assign({}, DEFAULTS, options);
  8. }
  1.   上面代码中,DEFAULTS对象是默认值,options对象是用户提供的参数。Object.assign方法将DEFAULTSoptions合并成一个新对象,如果两者有同名属性,则option的属性值会覆盖DEFAULTS的属性值。
    注: 由于存在深拷贝的问题,DEFAULTS对象和options对象的所有属性的值,都只能是简单类型,而不能指向另一个对象。否则,将导致DEFAULTS对象的该属性不起作用。
    此篇全部代码:
  1. <!DOCTYPE html>
  2. <html >
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>es6-object</title>
  6. <script>
  7. /*object*/
  8. //1.destructuring
  9. //ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring)。
  10. //es5
  11. if(1){
  12. let cat = 'ken';
  13. let dog = 'lili';
  14. let zoo = {cat: cat, dog: dog};
  15. console.log(zoo) ; //Object {cat: "ken", dog: "lili"}
  16. }
  17. //用ES6完全可以像下面这么写:
  18. if(1){
  19. let cat = 'ken';
  20. let dog = 'lili';
  21. let zoo = {cat, dog};
  22. console.log(zoo) ; //Object {cat: "ken", dog: "lili"}
  23. }
  24. //反过来可以这么写:
  25. if(1){
  26. let dog = {type: 'animal', many: 2};
  27. let { type, many} = dog;
  28. console.log(type, many) ; //animal 2
  29. }
  30.  
  31. /*2.属性名表达式(用方法(表达式)作为对象的属性名;表达式还可以用于定义方法名。)
  32. JavaScript语言定义对象的属性,有两种方法。*/
  33. if(1){
  34. let obj1 = {};
  35. // 方法一
  36. obj1.foo = true;
  37. // 方法二
  38. obj1['a'+'bc'] = 123;
  39. console.log(obj1);
  40. /*上面代码的方法一是直接用标识符作为属性名,方法二是用表达式作为属性名,这时要将表达式放在方括号之内。
  41. 如果使用字面量方式定义对象(使用大括号),在ES5中只能使用方法一(标识符)定义属性。
  42. var obj2 = {
  43. foo: true,
  44. abc: 123
  45. };*/
  46. //ES6允许字面量定义对象时,用方法(表达式)作为对象的属性名,即把表达式放在方括号内。
  47. let propKey = 'foo';
  48. let obj3 = {
  49. [propKey]: true,
  50. ['a'+'bc']: 123
  51. };
  52. console.log(obj3);
  53. //表达式还可以用于定义方法名。
  54. let ello='i';
  55. let obj4 = {
  56. ['h'+ello]() {
  57. return 'hi nick';
  58. }
  59. };
  60. console.log(obj4.hi()); // hi nick
  61. }
  62. //3. Object.is()用来比较两个值是否严格相等。它与严格比较运算符(===)的行为基本一致,不同之处只有两个:一是+0不等于-0,二是NaN等于自身。
  63. console.log(+0 === -0);//true
  64. console.log(NaN === NaN); // false
  65. console.log(Object.is(+0, -0)); // false
  66. console.log(Object.is(NaN, NaN)); // true
  67. /*
  68. 4.源对象的所有可枚举属性,复制到目标对象
  69. Object.assign方法用来将源对象(source)的所有可枚举属性,复制到目标对象(target)。
  70. 它至少需要两个对象作为参数,第一个参数是目标对象,后面的参数都是源对象。只要有一个参数不是对象,就会抛出TypeError错误。
  71. */
  72. if(1){
  73. let target = { a: 1 };
  74. let source1 = { b: 2 };
  75. let source2 = { c: 3 };
  76. Object.assign(target, source1, source2);
  77. console.log(target); // {a:1, b:2, c:3}
  78. //注意,如果目标对象与源对象有同名属性,或多个源对象有同名属性,则后面的属性会覆盖前面的属性。
  79.  
  80. let target1 = { a: 1, b: 1 };
  81. let source11 = { b: 2, c: 2 };
  82. let source21 = { c: 3 };
  83.  
  84. Object.assign(target1, source11, source21);
  85. console.log(target1); // {a:1, b:2, c:3}
  86. console.log(Object.assign({'name':'张三'},{'name':'nick','age':26,'sex':'男','sex':{'gander':'handsome'}}));
  87.  
  88. // Object.assign只拷贝自身属性,不可枚举的属性(enumerable为false)和继承的属性不会被拷贝。
  89.  
  90. let obj1=Object.assign({b: 'c'},
  91. Object.defineProperty({}, 'invisible', {
  92. enumerable: false,
  93. value: 'hello'
  94. })
  95. );
  96. console.log(obj1);// { b: 'c' }
  97.  
  98. let obj2 =Object.assign({b: 'c'},
  99. Object.defineProperty({}, 'invisible', {
  100. enumerable: true,
  101. value: 'hello'
  102. })
  103. );
  104. console.log(obj2);// {b: "c", invisible: "hello"}
  105.  
  106. // 属性名为Symbol值的属性,也会被Object.assign拷贝。
  107. let obj3=Object.assign({ a: 'b' }, { [Symbol('c')]: 'd' })
  108. console.log(obj3);// { a: 'b', Symbol(c): 'd' }
  109.  
  110. // 注意,Object.assign可以用来处理数组,但是会把数组视为对象。
  111. Object.assign([1, 2, 3], [4, 5]);// [4, 5, 3]
  112.  
  113. /* 其中,4覆盖1,5覆盖2,因为它们在数组的同一位置,所以就对应位置覆盖了。
  114. Object.assign还有很多用处,下面就看一下吧:
  115. 为对象添加属性
  116. */
  117. class Point {
  118. constructor(x, y) {
  119. Object.assign(this, {x, y});
  120. }
  121. }
  122.  
  123. /*这样就给Point类的对象实例添加了x、y属性。
  124. 为对象添加方法*/
  125. let SomeClass={test:'nick'};
  126. SomeClass.prototype={};
  127. Object.assign(SomeClass.prototype, {
  128. someMethod:function(arg1, arg2) {
  129.  
  130. },
  131. anotherMethod:function () {
  132.  
  133. }
  134. });
  135. console.log(SomeClass);
  136. // 等同于下面的写法
  137. let SomeClass2={test:'nick2'};
  138. SomeClass2.prototype={};
  139. SomeClass2.prototype.someMethod = function (arg1, arg2) {
  140.  
  141. };
  142. SomeClass2.prototype.anotherMethod = function () {
  143.  
  144. };
  145. console.log(SomeClass2);
  146.  
  147. /*上面代码使用了对象属性的简洁表示法,直接将两个函数放在大括号中,再使用assign方法添加到SomeClass.prototype之中。
  148. 克隆对象*/
  149.  
  150. function clone1(origin) {
  151. return Object.assign({}, origin);
  152. }
  153. /*
  154. 上面代码将原始对象拷贝到一个空对象,就得到了原始对象的克隆。
  155. 不过,采用这种方法克隆,只能克隆原始对象自身的值,不能克隆它继承的值。如果想要保持继承链,可以采用下面的代码。*/
  156.  
  157. function clone2(origin) {
  158. let originProto = Object.getPrototypeOf(origin);
  159. return Object.assign(Object.create(originProto), origin);
  160. }
  161. /* 在JS里子类利用Object.getPrototypeOf去调用父类方法,用来获取对象的原型。用它可以模仿Java的super。
  162. 将多个对象合并成一个对象
  163. 多个对象合并到某个对象*/
  164.  
  165. const merge1 =(target, ...sources) => Object.assign(target, ...sources);
  166.  
  167. // 多个对象合并到一个新对象
  168.  
  169. const merge2 = (...sources) => Object.assign({},...sources);
  170.  
  171. // 为属性指定默认值
  172.  
  173. const DEFAULTS = {
  174. logLevel: 0,
  175. outputFormat: 'html'
  176. };
  177.  
  178. function processContent(options) {
  179. let options1 = Object.assign({}, DEFAULTS, options);
  180. }
  181. /*
  182. 上面代码中,DEFAULTS对象是默认值,options对象是用户提供的参数。Object.assign方法将DEFAULTS和options合并成一个新对象,如果两者有同名属性,则option的属性值会覆盖DEFAULTS的属性值。
  183. 注: 由于存在深拷贝的问题,DEFAULTS对象和options对象的所有属性的值,都只能是简单类型,而不能指向另一个对象。否则,将导致DEFAULTS对象的该属性不起作用。*/
  184. }
  185. /*
  186. 5.proto属性
  187. proto属性,用来读取或设置当前对象的prototype对象。该属性一度被正式写入ES6草案,但后来又被移除(尽量别用)。目前,所有浏览器(包括IE11)都部署了这个属性。
  188. */
  189. if(1){
  190. // es6的写法
  191. let someOtherObj=function(){console.log('someOtherObj');};
  192. let obj1 = {
  193. __proto__: someOtherObj,
  194. method: function() {console.log('method');}
  195. };
  196. // es5的写法
  197. let obj2 = Object.create(someOtherObj);
  198. obj2.method = function() {};
  199. console.log(obj1);
  200. console.log(obj2);
  201. }
  202. // 17.Symbol类型
  203. //ES6引入了一种新的原始数据类型Symbol,表示独一无二的ID。凡是属性名属于Symbol类型,就都是独一无二的,可以保证不会与其他属性名产生冲突。
  204. if(1){
  205. let s = Symbol();
  206. console.log(typeof s);// "symbol"
  207. /*
  208. typeof运算符的结果,表明变量s是Symbol数据类型,而不是字符串之类的其他类型。
  209. 注意,Symbol函数前不能使用new命令,否则会报错。这是因为生成的Symbol是一个原始类型的值,不是对象。
  210. Symbol类型的值不能与其他类型的值进行运算,会报错。
  211. */
  212.  
  213. let sym = Symbol('My symbol');
  214. // "your symbol is " + sym
  215. // TypeError: can't convert symbol to string
  216. // `your symbol is ${sym}`
  217. // TypeError: can't convert symbol to string
  218. //但是,Symbol类型的值可以转为字符串。
  219. console.log(String(sym)); // 'Symbol(My symbol)'
  220. console.log(sym.toString()); // 'Symbol(My symbol)'
  221. }
  222. /*
  223. 6.内置代理
  224. Proxy 内置的一个代理工具,使用他可以在对象处理上加一层屏障:
  225.  
  226. S6原生提供Proxy构造函数,用来生成Proxy实例。
  227.  
  228. var proxy = new Proxy(target, handler)
  229. new Proxy()表示生成一个Proxy实例,它的target参数表示所要拦截的目标对象,handler参数也是一个对象,用来定制拦截行为。
  230. */
  231. if(1){
  232. let plain = {
  233. name : "hubwiz"
  234. };
  235. let proxy = new Proxy(plain, {
  236. get: function(target, property) {
  237. console.log(target);//plain
  238. console.log(property);//title
  239. return property in target ? target[property] : "汇智网";
  240. }
  241. });
  242. console.log(proxy.name);// "hubwiz"
  243. console.log(proxy.title);// "汇智网"
  244. }
  245. /*
  246. Proxy(target, handler), 这里的 handler有如下的方法:
  247. get(target, propKey, receiver):拦截对象属性的读取,比如proxy.foo和proxy['foo'],返回类型不限。最后一个参数receiver可选,当target对象设置了propKey属性的get函数时,receiver对象会绑定get函数的this对象。
  248. set(target, propKey, value, receiver):拦截对象属性的设置,比如proxy.foo = v或proxy['foo'] = v,返回一个布尔值。
  249. has(target, propKey):拦截propKey in proxy的操作,返回一个布尔值。
  250. deleteProperty(target, propKey) :拦截delete proxy[propKey]的操作,返回一个布尔值。
  251. enumerate(target):拦截for (var x in proxy),返回一个遍历器。
  252. hasOwn(target, propKey):拦截proxy.hasOwnProperty('foo'),返回一个布尔值。
  253. ownKeys(target):拦截Object.getOwnPropertyNames(proxy)、Object.getOwnPropertySymbols(proxy)、Object.keys(proxy),返回一个数组。该方法返回对象所有自身的属性,而Object.keys()仅返回对象可遍历的属性。
  254. getOwnPropertyDescriptor(target, propKey) :拦截Object.getOwnPropertyDescriptor(proxy, propKey),返回属性的描述对象。
  255. defineProperty(target, propKey, propDesc):拦截Object.defineProperty(proxy, propKey, propDesc)、Object.defineProperties(proxy, propDescs),返回一个布尔值。
  256. preventExtensions(target):拦截Object.preventExtensions(proxy),返回一个布尔值。
  257. getPrototypeOf(target) :拦截Object.getPrototypeOf(proxy),返回一个对象。
  258. isExtensible(target):拦截Object.isExtensible(proxy),返回一个布尔值。
  259. setPrototypeOf(target, proto):拦截Object.setPrototypeOf(proxy, proto),返回一个布尔值。
  260. 如果目标对象是函数,那么还有两种额外操作可以拦截。
  261. apply(target, object, args):拦截Proxy实例作为函数调用的操作,比如proxy(...args)、proxy.call(object, ...args)、proxy.apply(...)。
  262. construct(target, args, proxy):拦截Proxy实例作为构造函数调用的操作,比如new proxy(...args)。
  263. */
  264. </script>
  265. </head>
  266. <body>
  267.  
  268. </body>
  269. </html>

此篇终,待续……

es6笔记3^_^object的更多相关文章

  1. ES6笔记(5)-- Generator生成器函数

    系列文章 -- ES6笔记系列 接触过Ajax请求的会遇到过异步调用的问题,为了保证调用顺序的正确性,一般我们会在回调函数中调用,也有用到一些新的解决方案如Promise相关的技术. 在异步编程中,还 ...

  2. ES6笔记系列

    ES6,即ECMAScript 6.0,ES6的第一个版本是在2015年发布的,所以又称作ECMAScript 2015 如今距ES6发布已经一年多的时间,这时候才去学,作为一个JSer,羞愧羞愧,还 ...

  3. ES6笔记(1) -- 环境配置支持

    系列文章 -- ES6笔记系列 虽然ES6已经发布一年多了,但在各大浏览器之中的支持度还不是很理想,在这查看ES6新特性支持度 Chrome的最新版本浏览器大部分已经支持,在Node.js环境上支持度 ...

  4. ES6笔记(2)-- let的块级作用域

    系列文章 -- ES6笔记系列 一.函数级作用域 我们都知道,在ES6以前,JS只有函数级作用域,没有块级作用域这个概念 没有块级作用域,有利有弊,利于方便自由,弊于作用域内的变量容易被共享,例如这个 ...

  5. ES6笔记(3)-- 解构赋值

    系列文章 -- ES6笔记系列 解构赋值,即对某种结构进行解析,然后将解析出来的值赋值给相关的变量,常见的有数组.对象.字符串的解构赋值等 一.数组的解构赋值 function ids() { ret ...

  6. ES6笔记(4)-- Symbol类型

    系列文章 -- ES6笔记系列 Symbol是什么?中文意思是标志.记号,顾名思义,它可以用了做记号. 是的,它是一种标记的方法,被ES6引入作为一种新的数据类型,表示独一无二的值. 由此,JS的数据 ...

  7. ES6笔记(6)-- Set、Map结构和Iterator迭代器

    系列文章 -- ES6笔记系列 搞ES6的人也是够无聊,把JS弄得越来越像Java.C++,连Iterator迭代器.Set集合.Map结构都出来了,不知道说什么好... 一.简单使用 1. iter ...

  8. ES6笔记(7)-- Promise异步编程

    系列文章 -- ES6笔记系列 很久很久以前,在做Node.js聊天室,使用MongoDB数据服务的时候就遇到了多重回调嵌套导致代码混乱的问题. JS异步编程有利有弊,Promise的出现,改善了这一 ...

  9. ES6 笔记汇总

    ES6 笔记汇总 二.ES6基础-let和const命令 三.变量的解构赋值 四.字符串的拓展 五.正则表达式的拓展 ...将会持续更新,敬请期待

  10. ES6笔记2

    ES6笔记2 Promise Promise 是 ES6 引入的异步编程的新解决方案,语法上是一个构造函数 一共有3种状态,pending(进行中).fulfilled(已成功)和rejected(已 ...

随机推荐

  1. linux commands ---2 ,学习vim编辑器如何使用的方法。

    vim /data/yst.txt   打开一个文件之后,然后在命令行模式下,输入:help 可以调出 vim 的帮助文档. 然后会进入: 然后就可以查阅具体的帮助文档了,再也不用再网上找一些零散的v ...

  2. openssl使用+Demo

    1. websiteSSL(secure Socket Layer)TLS(transport Layer Security) - SSL3.0基础之上提出的安全通信标准,目前版本是1.0openss ...

  3. Delphi2010生成GB2312字库乱码问题

    用Delphi2010做一个点阵字库软件,字库生成部分是从一个用Delphi2007做旧的程序里扣出来的.点阵字库软件完成后生成GB2312字库在LED控制卡上显示为乱码.知道Delphi版本高于20 ...

  4. JS中Exception处理

    程序开发中,编程人员经常要面对的是如何编写代码来响应错误事件的发生,即例外处理(exception handlers).如果例外处理代码设计得周全,那么最终呈现给用户的就将是一个友好的界面.否则,就会 ...

  5. 布隆过滤器(BoomFilter)

    1.原理:           a.解决的问题:                判断一个元素是否在一个集合中             b.Hash表的特点:                i.快速准确 ...

  6. EQueue - 一个C#写的开源分布式消息队列的总体介绍(转)

    源: EQueue - 一个C#写的开源分布式消息队列的总体介绍 EQueue - 一个纯C#写的分布式消息队列介绍2 EQueue - 详细谈一下消息持久化以及消息堆积的设计

  7. iOS开发者的福利 — — iOS9+Xcode7免越狱免证书直接调试

    苹果发布Xcode7后, 开放了普通的AppleID也能真机调试( 非$99 或 $299, 只要能上AppStore下载应用的AppleID就行),下面教你具体做法,很简单的. 1.运行Xcode, ...

  8. VS2010环境下用ANSI C创建DLL和使用方法(转)

    源:VS2010环境下用ANSI C创建DLL和使用方法 . 创建DLL工程 1.2 创建一个dll工程. 操作:a.文件->新建->项目->Win32控制台应用程序. b.输入工程 ...

  9. linux下安装部署环境:jdk、tomcat、nginx

    一.安装jdk 一.查看Linux自带的JDK是否已安装 1.查看已经安装的jdk: # rpm -qa|grep jdk                ← 查看jdk的信息或直接执行 或 # rpm ...

  10. Python中下划线---完全解读

    Python 用下划线作为变量前缀和后缀指定特殊变量 _xxx 不能用'from module import *'导入 __xxx__ 系统定义名字 __xxx 类中的私有变量名 核心风格:避免用下划 ...