JavaScript 基础入门04

JavaScript 对象

介绍

对象(object)是js中的核心概念,也是最重要的数据类型。

那么什么是对象呢?

简单的说,对象就是一组键值对(key-value)的集合,是一种无序的复合数据集合。

var obj = {
name:"张三",
age:20
};

在上面的示例代码中,大括号定义了一个对象,并且将这个对象赋值给obj这个变量,So,此时我们的变量obj也就指向了一个对象。

在这个对象内部包含有两个键值对(当然,也可以将他们称为对象的两个成员),第一个键值对是name:"张三",name键名,也就是成员的名称,字符串张三键值,也就是成员的值。

键名键值之间使用冒号来进行分割。

第二个键值对是age:20,键名是age,键值是20

关于键名

一定要知道的一点是,在js中,对象的所有的键名都是字符串(ES6中又引入了Symbol可以作为键名),所以对象的键名加不加引号都可以,例如上面的demo,也可以写成下面的样子:

var obj = {
"name":"张三",
"age":20
};

即使对象的键名是数值,也会被自动转换成字符串。

需要注意的是,如果对象的键名不合符标识名的条件(比如第一个字符为数字,或者含有空格或运算符),且也不是数字,则必须加上引号,否则会报错。

// 报错
var obj = {
1p: 'Hello World'
}; // 不报错
var obj = {
'1p': 'Hello World',
'h w': 'Hello World',
'p+q': 'Hello World'
};

上面对象的三个键名,都不符合标识名的条件,所以必须加上引号。

对象的每一个键名又称为“属性”(property),它的“键值”可以是任何数据类型。如果一个属性的值为函数,通常把这个属性称为“方法”,它可以像函数那样调用。

var obj = {
p: function (x) {
return 2 * x;
}
}; obj.p(1) // 2

上面代码中,对象obj的属性p,就指向一个函数。

如果属性的值还是一个对象,就形成了链式引用。

var o1 = {};
var o2 = { bar: 'hello' }; o1.foo = o2;
o1.foo.bar // "hello"

上面代码中,对象o1的属性foo指向对象o2,就可以链式引用o2的属性。

对象的属性之间用逗号分隔,最后一个属性后面可以加逗号(trailing comma),也可以不加。

var obj = {
p: 123,
m: function () { ... },
}

上面的代码中,m属性后面的那个逗号,有没有都可以。

属性可以动态创建,不必在对象声明时就指定。

var obj = {};
obj.foo = 123;
obj.foo // 123

上面代码中,直接对obj对象的foo属性赋值,结果就在运行时创建了foo属性。

对象的引用

如果不同的变量名指向同一个对象,那么它们就是这个对象的引用,简单点说就是指向同一个内存地址。修改其中的一个变量,会影响到其他所有的变量。

var o1 = {};
var o2 = o1; o1.a = 1;
o2.a // 1 o2.b = 2;
o1.b // 2

上面代码中,o1和o2指向同一个对象,因此为其中任何一个变量添加属性,另一个变量都可以读写该属性。

此时,如果取消某一个变量对于原对象的引用,不会影响到另一个变量。

var obj1 = {a:"hello,world"};

var obj2 = obj1;

obj1 = 1;

console.log(obj2.a); // hello,world

在上面的代码中,obj1和obj2原本指向同一个对象,后期obj1指向了数字1,这时obj1的变化不会影响到obj2,obj2还指向原来的那个对象。

需要注意的是,这种引用的问题仅仅局限于对象类型,如果两个变量指向同一个原始类型的值。那么,变量这时都是值的拷贝。

var x = 1;
var y = x; x = 2;
y // 1

上面的代码中,当x的值发生变化后,y的值并不变,这就表示y和x并不是指向同一个内存地址.

语句和表达式需要注意的地方

我们在上面说过,想要创建一个对象,需要通过大括号的形式。但是如果行首就出现了大括号,那么此时它到底是表达式还是语句呢?

{
name:"张三"
}

上面的代码碰到了解析引擎,可能会出现两种含义:

  1. 这段代码中是一个表达式,表示的是一个包含于name:"张三"键值对的一个对象。
  2. 这表示了一个代码区块,里面有一个标签name,指向了表达式张三.

JS的解析引擎为了避免引发歧义,设定为,如果遇到这种代码段,无法确定是对象还是代码块,一律解释为代码块。

{
console.log(123);//输出结果为123
}

上面的语句就会被解释为代码块,因为只有处于代码块的环境下才能够执行。

如果需要将大括号及里面的内容解释为对象,最好在大括号的前面加上圆括号。因为圆括号的里面,只能是表达式,所以确保大括号只能解释为对象。

// 下面的代码正确
({
name:"张三"
})
// 下面的代码错误
({
console.log(123);
})

对象属性常见的操作

读取属性

在js的对象中,读取属性有两种方法,一种是使用点运算符,另外一种是使用方括号运算符

var obj = {
p: 'Hello World'
}; obj.p // "Hello World"
obj['p'] // "Hello World"

需要注意的是,当我们使用方括号运算符读取键名的时候,键名必须放在引号里面,否则会被当做变量处理。

var foo = 'bar';

var obj = {
foo: 1,
bar: 2
}; obj.foo // 1
obj[foo] // 2

上面代码中,引用对象obj的foo属性时,如果使用点运算符,foo就是字符串;如果使用方括号运算符,但是不使用引号,那么foo就是一个变量,指向字符串bar。

方括号运算符内部还可以使用表达式。

obj['hello' + ' world']
obj[3 + 3]

数字键可以不加引号,因为会自动转成字符串。

var obj = {
0.7: 'Hello World'
}; obj['0.7'] // "Hello World"
obj[0.7] // "Hello World"

上面代码中,对象obj的数字键0.7,加不加引号都可以,因为会被自动转为字符串。

注意,数值键名不能使用点运算符(因为会被当成小数点),只能使用方括号运算符。

var obj = {
123: 'hello world'
}; obj.123 // 报错
obj[123] // "hello world"

上面代码的第一个表达式,对数值键名123使用点运算符,结果报错。第二个表达式使用方括号运算符,结果就是正确的。

属性的赋值

在上面我们说过的点运算符和方括号运算符不仅可以读取属性也可以对属性进行赋值。

var obj = {};

obj.foo = 'Hello';
obj['bar'] = 'World';

在上面的代码中,我们分别使用了点运算符和方括号运算符对属性进行了赋值。

JavaScript 允许属性的“后绑定”,也就是说,你可以在任意时刻新增属性,没必要在定义对象的时候,就定义好属性。

var obj = { p: 1 };

// 等价于

var obj = {};
obj.p = 1;

属性的查看

如果想要查看对象中有哪些属性,可以使用Object.keys方法。

var obj = {
key1: 1,
key2: 2
}; Object.keys(obj);
// ['key1', 'key2']

属性的删除

我们可以通过delete命令来删除对象的属性,删除成功后返回true

var obj = { p: 1 };
Object.keys(obj) // ["p"] delete obj.p // true
obj.p // undefined
Object.keys(obj) // []

上面代码中,delete命令删除对象obj的p属性。删除后,再读取p属性就会返回undefined,而且Object.keys方法的返回值也不再包括该属性。

注意,删除一个不存在的属性,delete不报错,而且返回true。

var obj = {};
delete obj.p // true

上面代码中,对象obj并没有p属性,但是delete命令照样返回true。因此,不能根据delete命令的结果,认定某个属性是存在的。

只有一种情况,delete命令会返回false,那就是该属性存在,且不得删除。

var obj = Object.defineProperty({}, 'p', {
value: 123,
configurable: false
}); obj.p // 123
delete obj.p // false

另外,需要注意的是,delete命令只能删除对象本身的属性,无法删除继承的属性。

var obj = {};
delete obj.toString // true
obj.toString // function toString() { [native code] }

上面代码中,toString是对象obj继承的属性,虽然delete命令返回true,但该属性并没有被删除,依然存在。这个例子还说明,即使delete返回true,该属性依然可能读取到值。

判断属性是否存在 in

在JS中我们可以通过in运算符来判断对象中是否包含有某个属性(检查的是属性名,不是属性值),如果存在就返回true,如果不存在就返回false。

var obj = { p: 1 };
'p' in obj // true
'toString' in obj // true

in运算符的一个问题是,它不能识别哪些属性是对象自身的,哪些属性是继承的。就像上面代码中,对象obj本身并没有toString属性,但是in运算符会返回true,因为这个属性是继承的。

这时,可以使用对象的hasOwnProperty方法判断一下,是否为对象自身的属性。

var obj = {};
if ('toString' in obj) {
console.log(obj.hasOwnProperty('toString')) // false
}

属性的遍历

想要遍历对象,需要使用for..in来循环遍历。

var obj = {a: 1, b: 2, c: 3};

for (var i in obj) {
console.log('键名:', i);
console.log('键值:', obj[i]);
}
// 键名: a
// 键值: 1
// 键名: b
// 键值: 2
// 键名: c
// 键值: 3

for...in循环有两个使用注意点。

它遍历的是对象所有可遍历(enumerable)的属性,会跳过不可遍历的属性。

它不仅遍历对象自身的属性,还遍历继承的属性。

举例来说,对象都继承了toString属性,但是for...in循环不会遍历到这个属性。

var obj = {};

// toString 属性是存在的
obj.toString // toString() { [native code] } for (var p in obj) {
console.log(p);
} // 没有任何输出

上面代码中,对象obj继承了toString属性,该属性不会被for...in循环遍历到,因为它默认是“不可遍历”的。

如果继承的属性是可遍历的,那么就会被for...in循环遍历到。但是,一般情况下,都是只想遍历对象自身的属性,所以使用for...in的时候,应该结合使用hasOwnProperty方法,在循环内部判断一下,某个属性是否为对象自身的属性。


var person = { name: '老张' }; for (var key in person) {
if (person.hasOwnProperty(key)) {
console.log(key);
}
}
// name

with语句

with语句的格式如下:

with (对象) {
语句;
}

它的作用是操作同一个对象的多个属性时,提供一些书写的方便。

// 例一
var obj = {
p1: 1,
p2: 2,
};
with (obj) {
p1 = 4;
p2 = 5;
}
// 等同于
obj.p1 = 4;
obj.p2 = 5; // 例二
with (document.links[0]){
console.log(href);
console.log(title);
console.log(style);
}
// 等同于
console.log(document.links[0].href);
console.log(document.links[0].title);
console.log(document.links[0].style);

注意,如果with区块内部有变量的赋值操作,必须是当前对象已经存在的属性,否则会创造一个当前作用域的全局变量。

var obj = {};
with (obj) {
p1 = 4;
p2 = 5;
} obj.p1 // undefined
p1 // 4

上面代码中,对象obj并没有p1属性,对p1赋值等于创造了一个全局变量p1。正确的写法应该是,先定义对象obj的属性p1,然后在with区块内操作它。

这是因为with区块没有改变作用域,它的内部依然是当前作用域。这造成了with语句的一个很大的弊病,就是绑定对象不明确。

with (obj) {
console.log(x);
}

单纯从上面的代码块,根本无法判断x到底是全局变量,还是对象obj的一个属性。这非常不利于代码的除错和模块化,编译器也无法对这段代码进行优化,只能留到运行时判断,这就拖慢了运行速度。因此,建议不要使用with语句,可以考虑用一个临时变量代替with。

with(obj1.obj2.obj3) {
console.log(p1 + p2);
} // 可以写成
var temp = obj1.obj2.obj3;
console.log(temp.p1 + temp.p2);

JSON

JSON 格式(JavaScript Object Notation 的缩写)是一种用于数据交换的文本格式,2001年由 Douglas Crockford 提出,目的是取代繁琐笨重的 XML 格式。

特点

相比 XML 格式,JSON 格式有两个显著的优点:书写简单,一目了然;符合 JavaScript 原生语法,可以由解释引擎直接处理,不用另外添加解析代码。所以,JSON 迅速被接受,已经成为各大网站交换数据的标准格式,并被写入标准。

每个 JSON 对象就是一个值,可能是一个数组或对象,也可能是一个原始类型的值。总之,只能是一个值,不能是两个或更多的值。

语法规则

  1. 复合类型的值只能是数组或对象,不能是函数、正则表达式对象、日期对象。
  2. 原始类型的值只有四种:字符串、数值(必须以十进制表示)、布尔值和null(不能使用NaN, Infinity, -Infinity和undefined)。
  3. 字符串必须使用双引号表示,不能使用单引号。
  4. 对象的键名必须放在双引号里面。
  5. 数组或对象最后一个成员的后面,不能加逗号。

JSON合法示例

下面都是一些合法的JSON对象

["one", "two", "three"]

{ "one": 1, "two": 2, "three": 3 }

{"names": ["张三", "李四"] }

[ { "name": "张三"}, {"name": "李四"} ]

下面是一些不正确的JSON

{ name: "张三", 'age': 32 }  // 属性名必须使用双引号

[32, 64, 128, 0xFFF] // 不能使用十六进制值

{ "name": "张三", "age": undefined } // 不能使用 undefined

{ "name": "张三",
"birthday": new Date('Fri, 26 Aug 2011 07:13:10 GMT'),
"getName": function () {
return this.name;
}
} // 属性值不能使用函数和日期对象

注意,null、空数组和空对象都是合法的 JSON 值。

JSON对象

JSON对象是 JavaScript 的原生对象,用来处理 JSON 格式数据。它有两个静态方法:JSON.stringify()JSON.parse()

JSON.stringify()

1、基本使用方式:

JSON.stringify方法用于将一个值转为 JSON 字符串。该字符串符合 JSON 格式,并且可以被JSON.parse方法还原。

JSON.stringify('abc') // ""abc""
JSON.stringify(1) // "1"
JSON.stringify(false) // "false"
JSON.stringify([]) // "[]"
JSON.stringify({}) // "{}" JSON.stringify([1, "false", false])
// '[1,"false",false]' JSON.stringify({ name: "张三" })
// '{"name":"张三"}'

上面代码将各种类型的值,转成 JSON 字符串。

注意,对于原始类型的字符串,转换结果会带双引号。

JSON.stringify('foo') === "foo" // false
JSON.stringify('foo') === "\"foo\"" // true

上面代码中,字符串foo,被转成了""foo""。这是因为将来还原的时候,内层双引号可以让 JavaScript 引擎知道,这是一个字符串,而不是其他类型的值。

JSON.stringify(false) // "false"
JSON.stringify('false') // "\"false\""

上面代码中,如果不是内层的双引号,将来还原的时候,引擎就无法知道原始值是布尔值还是字符串。

如果对象的属性是undefined、函数或 XML 对象,该属性会被JSON.stringify过滤。

var obj = {
a: undefined,
b: function () {}
}; JSON.stringify(obj) // "{}"

上面代码中,对象obj的a属性是undefined,而b属性是一个函数,结果都被JSON.stringify过滤。

如果数组的成员是undefined、函数或 XML 对象,则这些值被转成null。

var arr = [undefined, function () {}];
JSON.stringify(arr) // "[null,null]"

上面代码中,数组arr的成员是undefined和函数,它们都被转成了null。

正则对象会被转成空对象。

JSON.stringify(/foo/) // "{}"

JSON.stringify方法会忽略对象的不可遍历的属性。

var obj = {};
Object.defineProperties(obj, {
'foo': {
value: 1,
enumerable: true
},
'bar': {
value: 2,
enumerable: false
}
}); JSON.stringify(obj); // "{"foo":1}"

上面代码中,bar是obj对象的不可遍历属性,JSON.stringify方法会忽略这个属性。

2、第二个参数说明

JSON.stringify方法还可以接受一个数组,作为第二个参数,指定需要转成字符串的属性。

var obj = {
'prop1': 'value1',
'prop2': 'value2',
'prop3': 'value3'
}; var selectedProperties = ['prop1', 'prop2']; JSON.stringify(obj, selectedProperties)
// "{"prop1":"value1","prop2":"value2"}"

上面代码中,JSON.stringify方法的第二个参数指定,只转prop1和prop2两个属性。

这个类似白名单的数组,只对对象的属性有效,对数组无效。

JSON.stringify(['a', 'b'], ['0'])
// "["a","b"]" JSON.stringify({0: 'a', 1: 'b'}, ['0'])
// "{"0":"a"}"

上面代码中,第二个参数指定 JSON 格式只转0号属性,实际上对数组是无效的,只对对象有效。

第二个参数还可以是一个函数,用来更改JSON.stringify的返回值。

function f(key, value) {
if (typeof value === "number") {
value = 2 * value;
}
return value;
} JSON.stringify({ a: 1, b: 2 }, f)
// '{"a": 2,"b": 4}'

上面代码中的f函数,接受两个参数,分别是被转换的对象的键名和键值。如果键值是数值,就将它乘以2,否则就原样返回。

注意,这个处理函数是递归处理所有的键。

var o = {a: {b: 1}};

function f(key, value) {
console.log("["+ key +"]:" + value);
return value;
} JSON.stringify(o, f)
// []:[object Object]
// [a]:[object Object]
// [b]:1
// '{"a":{"b":1}}'

上面代码中,对象o一共会被f函数处理三次,最后那行是JSON.stringify的输出。第一次键名为空,键值是整个对象o;第二次键名为a,键值是{b: 1};第三次键名为b,键值为1。

递归处理中,每一次处理的对象,都是前一次返回的值。

var o = {a: 1};

function f(key, value) {
if (typeof value === 'object') {
return {b: 2};
}
return value * 2;
} JSON.stringify(o, f)
// "{"b": 4}"

上面代码中,f函数修改了对象o,接着JSON.stringify方法就递归处理修改后的对象o。

如果处理函数返回undefined或没有返回值,则该属性会被忽略。

function f(key, value) {
if (typeof(value) === "string") {
return undefined;
}
return value;
} JSON.stringify({ a: "abc", b: 123 }, f)
// '{"b": 123}'

上面代码中,a属性经过处理后,返回undefined,于是该属性被忽略了。

3、第三个参数

JSON.stringify还可以接受第三个参数,用于增加返回的 JSON 字符串的可读性。如果是数字,表示每个属性前面添加的空格(最多不超过10个);如果是字符串(不超过10个字符),则该字符串会添加在每行前面。

JSON.stringify({ p1: 1, p2: 2 }, null, 2);
/*
"{
"p1": 1,
"p2": 2
}"
*/ JSON.stringify({ p1:1, p2:2 }, null, '|-');
/*
"{
|-"p1": 1,
|-"p2": 2
}"
*/

4、参数对象的toJSON方法

如果参数对象有自定义的toJSON方法,那么JSON.stringify会使用这个方法的返回值作为参数,而忽略原对象的其他属性。

下面是一个普通的对象。

var user = {
firstName: '三',
lastName: '张', get fullName(){
return this.lastName + this.firstName;
}
}; JSON.stringify(user)
// "{"firstName":"三","lastName":"张","fullName":"张三"}"

现在,为这个对象加上toJSON方法。

var user = {
firstName: '三',
lastName: '张', get fullName(){
return this.lastName + this.firstName;
}, toJSON: function () {
return {
name: this.lastName + this.firstName
};
}
}; JSON.stringify(user)
// "{"name":"张三"}"

上面代码中,JSON.stringify发现参数对象有toJSON方法,就直接使用这个方法的返回值作为参数,而忽略原对象的其他参数。

Date对象就有一个自己的toJSON方法。

var date = new Date('2015-01-01');
date.toJSON() // "2015-01-01T00:00:00.000Z"
JSON.stringify(date) // ""2015-01-01T00:00:00.000Z""

上面代码中,JSON.stringify发现处理的是Date对象实例,就会调用这个实例对象的toJSON方法,将该方法的返回值作为参数。

toJSON方法的一个应用是,将正则对象自动转为字符串。因为JSON.stringify默认不能转换正则对象,但是设置了toJSON方法以后,就可以转换正则对象了。

var obj = {
reg: /foo/
}; // 不设置 toJSON 方法时
JSON.stringify(obj) // "{"reg":{}}" // 设置 toJSON 方法时
RegExp.prototype.toJSON = RegExp.prototype.toString;
JSON.stringify(/foo/) // ""/foo/""

上面代码在正则对象的原型上面部署了toJSON()方法,将其指向toString()方法,因此转换成 JSON 格式时,正则对象就先调用toJSON()方法转为字符串,然后再被JSON.stringify()方法处理。

JSON.parse()

JSON.parse方法用于将 JSON 字符串转换成对应的值。

JSON.parse('{}') // {}
JSON.parse('true') // true
JSON.parse('"foo"') // "foo"
JSON.parse('[1, 5, "false"]') // [1, 5, "false"]
JSON.parse('null') // null var o = JSON.parse('{"name": "张三"}');
o.name // 张三

如果传入的字符串不是有效的 JSON 格式,JSON.parse方法将报错。

JSON.parse("'String'") // illegal single quotes
// SyntaxError: Unexpected token ILLEGAL

上面代码中,双引号字符串中是一个单引号字符串,因为单引号字符串不符合 JSON 格式,所以报错。

为了处理解析错误,可以将JSON.parse方法放在try...catch代码块中。

try {
JSON.parse("'String'");
} catch(e) {
console.log('parsing error');
}

JSON.parse方法可以接受一个处理函数,作为第二个参数,用法与JSON.stringify方法类似。

function f(key, value) {
if (key === 'a') {
return value + 10;
}
return value;
} JSON.parse('{"a": 1, "b": 2}', f)
// {a: 11, b: 2}

上面代码中,JSON.parse的第二个参数是一个函数,如果键名是a,该函数会将键值加上10。

可以在下面这个网址进行JSON验证:http://www.bejson.com/

JavaScript基础入门04的更多相关文章

  1. JavaScript 基础入门

    JavaScript 基础入门   JavaScript 的组成 JS 由三部分组成,它们分别是:ECMAScript.DOM.BOM. ECMAScript     因为网景开发了JavaScrip ...

  2. JavaScript基础入门10

    目录 JavaScript 基础入门10 正则表达式 为什么使用正则表达式? 正则表达式的应用场景 如何创建一个正则表达式 基础语法 具有特殊意义的转义字符 量词 字符类 贪婪模式 练习 邮箱验证 中 ...

  3. JavaScript基础入门09

    目录 JavaScript 基础入门09 Event 自定义右键菜单 获取鼠标按键 获取鼠标坐标 获取键盘按键 页面中位置的获取 浏览器的默认行为 冒泡 什么是冒泡 小练习 JavaScript 基础 ...

  4. JavaScript基础入门08

    目录 JavaScript 基础入门08 DOM 介绍 绑定事件 给一组元素绑定事件 节点 节点树 节点类型 选取文档内容 通过id选取元素 通过指定的标签名选取元素 用指定的css类来选取元素 通过 ...

  5. JavaScript基础入门07

    目录 JavaScript 基础入门07 BOM window对象 Navigator对象 Screen 对象 Location对象 History 对象 JavaScript 基础入门07 BOM ...

  6. JavaScript基础入门06

    目录 JavaScript 基础入门06 Math 对象 Math对象的静态属性 Math对象的静态方法 指定范围的随机数 返回随机字符 三角函数 Date对象 基础知识 日期对象具体API 构造函数 ...

  7. JavaScript基础入门05

    目录 JavaScript 基础入门05 严格模式 严格模式的设计目的 如何开启使用严格模式 显式报错 字符串 字符串的创建 字符串实例方法之常用API JavaScript 基础入门05 严格模式 ...

  8. javascript基础入门之js中的结构分支与循环语句

    javascript基础入门之js中的结构分支与循环语句 程序的结构①顺序结构:自上而下:②选择(分支)结构:多条路径,根据不同的条件,只执行其中一个:③循环结构:重复某些代码④配合特定的语句实现选择 ...

  9. javascript基础入门之js中的数据类型与数据转换01

    javascript基础入门之js中的数据结构与数据转换01 js的组成(ECMAScript.BOM.DOM)        js中的打印语句:        数据类型        变量      ...

随机推荐

  1. 重装maven

    重装原因:换旧版本! 一.直接删除maven文件夹 二.直接删除本地仓库文件 三.删除之前相关的项目(不是必须) 四.下载一个新的,网址 https://maven.apache.org/downlo ...

  2. css3 扇形动画

    扇形动画,因为我工作中遇到了只执行一次就ok,所以没细研究,该css暂时只能执行1次扇形动画,无限循环会有问题. css: @keyframes rotateAn{ 0%{transform: rot ...

  3. javaScript--for循环的性能提升

    //为什么性能提升? //第一种写法每次循环时都需要从内存中取出students.length并判断条件是否成立 //第二种写法只需要取一次students.length就可以 //第二种方式弊端:l ...

  4. 鸟哥linux私房菜第6章笔记

    鸟哥linux私房菜第6章笔记 文件权限 修改 chgrp [-R] groupname filename //修改文件所属组 chown [-R] ownername[:groupname] fil ...

  5. k8s权威指南-从xx到oo的实践全接触

    基本概念与术语 集群的2种管理角色:master和node master 集群的控制节点,负责整个集群的管理与控制,运行着关键进程: 1,k8s api server: 提供了HTTP Rest 接口 ...

  6. MessagePack Java Jackson 序列化和反序列化 POJO 为 MessagePack 的数组类型用来与 msgpack-java:0.6 保持兼容性

    在 msgpack-java 0.6 或者早期的版本中,POJO 在 MessagePack 中被序列化和反序列化为数组变量. 变量的顺序是基于 Java 类中变量的内部顺序了,这种本来是一种原生的序 ...

  7. TensorFlow使用记录 (八): 梯度修剪 和 Max-Norm Regularization

    梯度修剪 梯度修剪主要避免训练梯度爆炸的问题,一般来说使用了 Batch Normalization 就不必要使用梯度修剪了,但还是有必要理解下实现的 In TensorFlow, the optim ...

  8. return返回方法值:狮子玩具

    public class Lion { String color ="黄色"; public void run(){ System.out.println("正在以0.1 ...

  9. iOS开发之实现图片自动切换(类似android画廊效果)

    #import ViewController.h #define ImageViewCount 5   @interface ViewController ()<uiscrollviewdele ...

  10. Ubuntu安装之pycharm安装

    什么??公司要用Ubuntu(乌班图)?不会用??怎么进行python开发??? 乌班图操作系统下载地址:http://releases.ubuntu.com/18.04/ubuntu-18.04.1 ...